類中的變數(包括基本資料型別,物件引用)在載入物件位元組碼進記憶體,在使用其之前,呼叫構造方法之前就已經完成初始化賦值了。其中static 修飾的變數在載入物件位元組碼時時就賦值了,其他變數在這以後被賦值,也就是static 修飾的先賦值。
驗證**如下:
package cn.ytu.en;
class circle
circle(int a)
}class thirdcircle
//普通**塊
//靜態物件引用
static circle c1=new circle();
thirdcircle()
//普通物件引用
circle c3=new circle(3);
thirdcircle(int a)
}public class inittest
/*輸出結果如下:
* * inittest()
* circle()+5
* 0* circle()
* circle()+1
* circle()+3
* 8* thirdciecle()
* circle()+2
* end
* circle()+1
* circle()+3
* thirdciecle()+1
* circle()+4
* *
* */
}從結果可以看出,在建立 thirdcircle 物件( new thirdcircle()),呼叫其構造方法之前,類中變數就已經完成其初始化過程。1、static 修飾的先執行,無論是static **塊還是變數,這兩個的執行順序是由其在類中的位置決定的,如上例,static**塊與static circle c1 先完成初始化,且static**塊在static circle c1 之前,所以static**塊先執行,如果static circle c1 在前,則它先執行。同理普通**塊與普通物件引用初始化也是如此。
2、在static 修飾的完成初始化之後,再是其他變數完成初始化
,如c3以及thirdcircle類中的變數b。
3、等所有的變數都完成了初始化過程以後,構造方法才被呼叫,生成物件。
4、static 修飾的,無論是**塊還是變數,在乙個類中只會被呼叫一次,不管是建立幾個類物件。如上例new thirdcircle(1),第二次建立 thirdcircle 物件,static **塊與 static circle c1=new circle() 不再被呼叫了,總共只被呼叫了一次
5、除了static以外的**塊和變數,呼叫次數與建立物件數一一對應。如上例new thirdcircle(1),第二次建立 thirdcircle 物件,以及 circle c3=new circle(3) 依然被呼叫了,這樣總共被呼叫了兩次
以上就是類中變數初始化過程了。
C 類變數初始化
c 類變數初始化 c 為中類物件的構造順序是這樣的 1.分配記憶體,呼叫建構函式時,隱式 顯示的初始化各資料成員 2.進入建構函式後在建構函式中執行一般計算 c 類中變數的初始化 1.初始化列表 csomeclass csomeclass x 0 y 1 const常量定義必須初始化,且必須使用初始...
類成員變數初始化
在 c 中,類的成員變數未初始化問題,取決於物件建立方式,不同的建立方式,直接導致類成員變數的初值不同。本文通過下例,得出一下結論 1.在函式體內置立乙個物件,類成員變數和普通的區域性變數一樣,是乙個隨機值。2.建立乙個全域性成員物件,類成員變數和全域性變數一樣,編譯器賦值為 0。3.在函式體內 n...
C 類中成員變數初始化
c 類中成員變數包括主要四種 普通成員變數,常量成員變數,靜態成員變數,靜態常量成員變數 上述成員變數該如何初始化,注意不是賦值。由於普通成員變數和常量成員變數,每乙個類例項化,都乙份記憶體拷貝。c 規定成員變數在宣告 注意宣告與定義區別 時,不允許初始化,因此這些變數只能放在建構函式初始化列表中。...