繼承時的初始化

2021-05-01 06:19:40 字數 1169 閱讀 8198

例:

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.沒有父類的...