例:
class insect
static int x1=prt("static insect.x1");
static int prt(string s)
}public class beetle extends insect
static int x2=prt("static beetle.x2");
public static void main(string args)
}輸出結果:
static insect.x1
static beetle.x2
beetle constructor
i=9,j=0
beetle.k
k=47
j=39
首先要明確三條規則:
一jvm用到某個類時才會將該類裝載進來,如果該類擁有父類,則會先將該類的父類裝載進來。
二當乙個類被jvm裝載,則會初始化static修飾的成員。
三當呼叫某個類的建構函式時,如果該類擁有父類,則會先呼叫父類的建構函式。在執行建構函式裡的語
句前,先會初始化該類中非static的成員(static修飾的成員在裝載時已被初始化).
了解了以上三點後,對以上輸出結果進行分析:
首先程式的入口是main(),在beetle這個類中,又由於該類有父類insect,根據第一,二條規則,首先裝載insect類,初始化insect內的靜態成員,輸出static insect.x1。接著裝載beetle類,初始化beetle的靜態成員,輸出static beetle.x2
這個時候才開始執行main()中的語句:
prt("beetle constructor");輸出beetle constructor。
beetle b=new beetle();會呼叫beetle的無參構造方法,根據第三條規則,會呼叫其父類insect的無參構造方法(),在執行該方法之前,會初始化變數i=9;j=0;接著執行該方法內的語句:
prt("i="+i+",j="+j);輸出i=9,j=0 。這時候j=39.
初始化beetle內的成員,
int k=prt("beetle.k");輸出:beetle.k。k=47。
最後才執行beetle構造方法內的語句:
prt("k="+k);輸出k=47
prt("j="+j);輸出j=39
繼承與初始化
當存在繼承的情況時,各變數的初始化情況變得更為複雜了 不關區域性變數的事 我們有必要梳理一下。class insect private static int x1 printinit static insect.x1 initialized public int x2 printinit shape...
繼承類的初始化
執行時,先訪問main函式。載入器開始啟動並找出該類的編譯 載入時,由於extends知道有乙個基類,於是載入基類。如果基類仍舊有基類,那麼再載入。直到所有的基類載入完畢。很重要的一點是static方法是在載入類的時候就被執行了,而static域也在此時也會在此時進行初始化。所有的類載入完畢。開始建...
Objective C 繼承,初始化方法
一.繼承 1.繼承的上層 父類,繼承的下層 子類 2.繼承是單向的 3.繼承具有傳遞性 子類繼承父類的特徵和行為 4.子類擴充套件父類,更加具體 oc中的繼承 1.oc中的繼承,即乙個類繼承另乙個類 2.被繼承的類稱為父類或超類 3.繼承的類為子類 繼承的特點 1.oc中只允許單繼承 2.沒有父類的...