Java中靜態變數和非靜態變數的初始化順序

2021-04-13 14:46:22 字數 2023 閱讀 3016

先看下面的程式:

package c05.net;

class bowl

void f1()

}class cupboard

static bowl b3 = new bowl(3);

}class table

table(string a,int i)

}public class order

public static void main(string args)

}執行結果:

bowl(2)

bowl(3)

bowl(1)

cupboard()

creating new cupboard() in main

bowl(1)

cupboard()

creating new cupboard() in main

bowl(10)

oktable()

ok分析:首先程式從public類開始,裝載order,class,執行static cupboard t1 = new cupboard();

由於t1是乙個物件引用變數,首先得到初始化,然後轉到cupboard類的例項中,這時候程式開始初始化

該例項中的變數,按照先static後非static變數初始化的順序原則開始初始化各個變數,此時,

static bowl b2 = new bowl(2);

static bowl b3 = new bowl(3);

這兩塊先得到初始化

然後    bowl b1 = new bowl(1);得到初始化(注意,這是非stataic變數)

然後轉到cupboard() 建構函式。

此時cupboard類已經初始化完畢,程式返回到public類中,又發現有 static table t2;

開始初始化,由於t2只是個宣告的變數,並沒有建立乙個table物件讓它指向,因此不要管這個t2變數。

在public類中,由於此時再沒有static變數可以初始化,那麼程式轉到static方法main中進行,

(注意:bowl t3 = new bowl(10); 這一句為什麼得不到初始化,是因為此時沒有建立類order的例項,所以程式目前還不會初始化該**,至於以後會不會初始化,還要看在main方法中是否會建立order類的例項,如建立了,則一定初始化,否則不會。)

在main方法中,

system.out.println("creating new cupboard() in main");//首先列印該行要輸出的語句

new cupboard();   //建立了cupboard類的例項,程式轉到cupboard中進行變數初始化,此時要注意:    

static變數的初始化,它只能初始化一次,也就是說,如果前面已經初始化過了,那麼此時就不必要再初

始化了,這一點要牢記!!!

system.out.println("creating new order() in main");//程式轉入此行列印要輸出的語句

order od = new order();//建立order物件例項,程式轉入例項od中,此時bowl t3 = new bowl(10);

這一句的t3會得到初始化,程式轉到bowl類中進行有關的操作,操作完後返回到main方法中

od.t3.f1();   //呼叫例項t3中的方法f()

table t4 = new table("aa",1); //建立table類的例項,讓t4指向這個例項,t4得到初始化,呼叫table含

有引數的構造方法,程式進行下去。

這樣就完成了對這個程式的真個的流程的分析,如果有錯誤的地方,或者還要補充的地方,還希望大家

指點一下,謝謝!!!

最後再總結一下:

初始化順序是:

(1) 先是父類的static變數和static初始化塊

(2)然後是子類的static變數和static初始化塊  

(3)父類的例項變數、初始化快

(4)父類的構造方法

(5)子類的例項變數、初始化快

(6)子類構造方法

Java靜態變數和非靜態變數

記憶體分配 靜態方法和靜態變數建立之後一直使用同一塊記憶體,是連續的。非靜態方法會存在於記憶體的多個地方,是離散的。生命週期 靜態變數的生存週期是應用的生存週期。非靜態變數的存在週期取決於例項化的類的存在週期。呼叫方式 靜態變數只能是 class.靜態變數 來呼叫,類的例項不能呼叫。非靜態變數在變數...

靜態變數和非靜態變數

class string1 a和b編譯報錯,can not make a static referrence to no static filed s3,s4 分析 string s1 pingguo string s2 xiangjiao string s3 new string lizi str...

java 靜態變數 與 非靜態變數

一 建立乙個類的物件時 new 類名 時,該類的.class檔案會被載入到一段記憶體中。1.先將該類的.class檔案會被載入到一段記憶體,初始化static屬性和方法,為他們分配空間,以後一直在記憶體中,即使這個物件被銷毀。這就是不建議使用static屬性和方法的原因之一 2.copy其中非sta...