帶有繼承和靜態的類的初始化以及載入過程(重要)

2021-07-24 17:45:19 字數 1401 閱讀 4356

package com.google.test;

public class baseclass

private int i = 9;

protected int j;

public baseclass()

private static int x1 = printinit(「1」);

static int printinit(string s) 

void testbasenormalmethod()

package com.google.test;

public class testclassinit extends baseclass

private int i = 9;

protected int j;

public baseclass()

private static int x1 = printinit("1");

static int printinit(string s)

void testbasenormalmethod()

}*/private void testnomalmethod1()

private int k = printinit("3");

public testclassinit()

private int k2 = printinit("4");

private void testnomalmethod2()

public static void main(string args)

private static int x2 = printinit("test");

/** * 步驟如下:

* 1.先編譯子類.class載入,看到extents後載入父類,先找靜態的方法得出結果:1(這一步不管子類有沒有建立子類物件都要執行)

* 2.父類執行完以後執行子類的靜態方法

* (1.普通靜態方法優先於main方法執行,雖然main方法也是靜態的,2.同樣這一步不管子類有沒有建立子類物件都要執行)得出結果:test ,2

* 3.建立子類物件時候呼叫子類構造方法,子類構造方法預設有一條super()來呼叫父類構造方法,這時候不會呼叫父類構造方法之前的普通方法。

* 得出結果:i=9,j=0。注意:基本型別boolean預設值為false,char預設值為:\u0000,其他全部為0,引用型別預設值為null。

* 4.執行子類從父類繼承下來的靜態方法,然後執行自身的構造方法,得出結果:3,(k=47);4(k2=47)

* 5.執行自身的構造方法。得出結果:k=47,j=39

*//**執行結果:

* 1

test

2i=9,j=034

k=47

j=39*/

初始化塊和靜態初始化塊

初始化塊的使用 變數,靜態變數,方法,靜態方法 由圖可知變數沒問題 上面的方法不可行能否初始化靜態方法 嘗試使用初始化塊初始化構造方法 最後比較一下構造方法初始化,初始化塊初始化,靜態初始化塊初始化當中誰最先被初始化 package staticinitializelump public class...

繼承類的初始化

執行時,先訪問main函式。載入器開始啟動並找出該類的編譯 載入時,由於extends知道有乙個基類,於是載入基類。如果基類仍舊有基類,那麼再載入。直到所有的基類載入完畢。很重要的一點是static方法是在載入類的時候就被執行了,而static域也在此時也會在此時進行初始化。所有的類載入完畢。開始建...

類的繼承和類的初始化

父類 子類 class a para1 para def init self,name,name1 self.name name self.name1 name1 def function1 self print function1 def functon2 self print function2...