1. 程式人生 > >Java中的Package.Import.Class以及和C++的比較(二)--類成員初始化及順序

Java中的Package.Import.Class以及和C++的比較(二)--類成員初始化及順序

接下來主要都是關於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;//第二個初始化
}

當一個類被例項化時,關於類成員初始化的順序,是這樣的:
  1. 該類的所有static變數被自動初始化
  2. static變數定義初始化以及static初始化塊--這2個的初始化順序是按照定義的先後順序來的,如果塊在前,定義在後,那麼先塊初始化,後定義初始化;
  3. 然後建立物件,分配儲存空間,儲存空間清零,設定預設值
  4. 非static變數定義初始化以及非static初始化塊--按照定義先後順序;
  5. 建構函式初始化。
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。