Java中的Package.Import.Class以及和C++的比較(二)--類成員初始化及順序
阿新 • • 發佈:2019-01-31
接下來主要都是關於Class的內容。
類成員初始化
在C++中,這樣做是不行的:
class a
{
public:
int a = 0;//不能初始化 編譯失敗
}
但是在java中,這是完全可行的。在C++中,如果:
int a;
你會發現a的值是不確定的。
但是在java中,a的值肯定是0,因為java會自動初始化這個值為0。
這是不是就意味著,在java裡,int a = 0; 這樣的做法是多餘的?
只要int a;就可以了,因為變數會被自動賦值為0?
希望有知道的人可以解答一下,先謝過。
補充一個事:
變數作為類的屬性的時候才會有編譯器幫你初始化為0,因為在給類分配完空間後,分配的空間裡的所有內容會被自動賦值為0;
如果是區域性變數,還是需要自己手動初始化。
在java中,初始化方法還有一個“初始化塊”,你完全可以在這個塊裡初始化,而不必在類的建構函式裡。
另外,成員變數的初始化順序是由定義的先後順序決定的。比如:
class A
{
public int a = 1;//第一個初始化
public int b = 1;//第二個初始化
}
當一個類被例項化時,關於類成員初始化的順序,是這樣的:
- 該類的所有static變數被自動初始化;
- static變數定義初始化以及static初始化塊--這2個的初始化順序是按照定義的先後順序來的,如果塊在前,定義在後,那麼先塊初始化,後定義初始化;
- 然後建立物件,分配儲存空間,儲存空間清零,設定預設值;
- 非static變數定義初始化以及非static初始化塊--按照定義先後順序;
- 建構函式初始化。
class A { public int a = 9; //7-自動初始化為0 10-初始化為指定的9 public int b = 0; //8-自動初始化為0 11-初始化為指定的0 { a = 1; // 12 b = 2; // 13 c = 5; // 14 } public int c = 3; //9-自動初始化為0 15-初始化為指定的3 public static int sa = 5; //1-自動初始化為0 3-初始化為指定的5 static { sa = 2; // 4 sb = 7; // 5 } public static int sb = 3; //2-自動初始化為0 6-初始化為指定的3 A() { a = 16; // 16 sb = 50; // 17 } }
上面的程式,數字代表初始化順序。最後各變數的值為:
sa = 2;sb = 50;
a = 16;
b = 2;
c = 3;
一個比較有趣事
java沒有解構函式,這個和C++不同,因為java有記憶體回收機制。
但是java有一個函式,過載這個函式可以達到類似解構函式的效果,這個函式是:finalize。