繼承與初始化

2021-09-02 05:16:08 字數 1031 閱讀 7128

當存在繼承的情況時,各變數的初始化情況變得更為複雜了(不關區域性變數的事),我們有必要梳理一下。

class insect

private static int x1 = printinit("static insect.x1 initialized");

public  int x2 = printinit("shape.x2 initialized");

static int printinit(string s)

}public class beetle extends insect

public  int x1 = printinit("circle.x2 initialized");

private static int x2 = printinit("static beetle.x2 initialized");

public static void main(string args)

}輸出結果:

static insect.x1 initialized

static beetle.x2 initialized

beetle constructor

shape.x2 initialized

i = 9,j = 0

beetle.k initialized

circle.x2 initialized

k = 47

j = 0

由輸出結果可以看出:先初始化基類的靜態域==》子類的靜態域==》基類的非靜態成員變數==》基類的構造方法==》子類的非靜態成員變數==》子類的構造方法。

總結:訪問beetle類時載入它的位元組碼時,發現它有乙個基類,於是開始載入它的基類(即使你不打算生成基類的物件),如果基類還有基類,則以此類推。位元組碼載入完畢後,根基類的靜態域會先初始化,然後匯出類,因為匯出類很可能依賴基類的成員。

至此,類載入完畢,物件就可以開始建立了。首先,物件的基本型別會被設定為0(等價0),引用物件被設定為null,之後基類的構造器被呼叫,匯出類的構造器和基類的順序一樣。基類構造器呼叫後,例項變數按次序被初始化。

java 繼承與初始化

class b public static int x b printint b static init public int y b printint b no static init public static int printint string s class c extends b pu...

繼承時的初始化

例 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...

Objective C 繼承,初始化方法

一.繼承 1.繼承的上層 父類,繼承的下層 子類 2.繼承是單向的 3.繼承具有傳遞性 子類繼承父類的特徵和行為 4.子類擴充套件父類,更加具體 oc中的繼承 1.oc中的繼承,即乙個類繼承另乙個類 2.被繼承的類稱為父類或超類 3.繼承的類為子類 繼承的特點 1.oc中只允許單繼承 2.沒有父類的...