由static關鍵字談java基礎

十五樓亮哥發表於2015-02-01

最近在想,自己算是中級程式設計師還是高階程式設計師,已經工作四年了,還沒有對自己有一個明確的定位。畢竟程式設計師

的級別也不能單純以工作時間作為唯一衡量標準。

在一個公司待一段時間,不管你的技術好與壞,總可以去適應公司的業務,框架,工作氛圍。所有很多程式設計師,包

括我自己。能按時交付自己的工作成果,就覺得自己很了不起,飄飄然。IT技術更新很快,只有不斷學習,才能進步。

而且,我發現自己工作四年,工作還算得心應手,但是偶爾碰到一些基礎知識,還是束手無策。這讓我反思,在追求新

技術,新思想的同時,是不是偶爾停下腳步,紮實一下基礎知識呢?你們怎麼看呢?請大家指教。

廢話不多說,下面看一個java基礎知識點:static關鍵字。首先來看static的特點:

       (1)static變數也稱作靜態變數:靜態變數被所有的物件所共享,在記憶體中只有一個副本,它當且僅當在類初次載入時會被初始化。

     (2)被static關鍵字修飾的方法或者變數不需要依賴於物件進行訪問,類被載入了,可以通過類名去進行訪問。

      (3)static關鍵字還有一個作用就是 用來形成靜態程式碼塊以優化程式效能。static塊可以置於類中的任何地方,類中可以有多個static塊。在類初次被載入的時候,會按照static塊的順序來執行每個static塊,並且只會執行一次。


 下面來看一個例子:

public class Student {
	private static int sid = 0;
	private String name;
	private int age;

	public Student(String name) {
		this.name = name;
		age = sid++;
	}

	public static int getSid() {
		return sid;
	}

	public static void setSid(int sid) {
		Student.sid = sid;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public static void main(String[] args) {
		Student.sid = 100;
		Student s1 = new Student("lyl"); 
		System.out.println(s1.getAge());
		System.out.println(s1.sid);
	}

}


下面是記憶體分析圖:



輸出結果:

100
101


知識點:

(1)static成員變數,存在於data seg記憶體資料段中,int基本資料型別,只佔這一塊記憶體

(2)Student.sid = 100就是講資料段中的sid的值修改為100

(3)new Studnet("lyl")的時候,會呼叫建構函式,字串“lyl”初始化在資料段。構造方法的形參name執行資料段中的“lyl” 

this.name就是Student的name屬性,將形參name賦值給Student的name屬性。等價於student的name屬性也指向資料段的“lyl”

(4)age = sid++;這個操作的原則是:先賦值,再加加。即 age = 100  age加加就等於101

(5)執行完構造方法,形參name的棧空間自動消失。


相關文章