java解惑 一 之類的初始化

2021-08-27 19:56:16 字數 2243 閱讀 6830

學而不精則淡,精而不用則廢。

了解包括繼承和static在內的初始化權過程,以對所發生的一切有個全域性性的把握,是很有益的。請看下面乙個例子:

class insect 

public insect()

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

int printinit(string s)

}

public class beetle extends insect 

public beetle()

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

public static void main(string args)

}

output

static codes initialized!

beetle static codes initialized!

beetle constructor

static insect.x1 initialized

i=0,j=0

static beetle.k initialized

static beetle.x2 initialized

k=47

j=39

小葉有點想不通為什麼會這樣子?其實,搞清楚了static和繼承對類的載入順序的影響就懂了。

第一步,beetle找到主程式路口---main方法,然後找到該類的class檔案,發現該類還有個 基類。

第二步:進入insect類,按照**書寫順序,載入static**塊,列印出static codes initialized!。

第三步:繼續在insect類中找,發現沒有static屬性,回到派生類beetle,載入static**塊,列印出beetle

static codes initialized!(static依賴於類生存的,並且static修飾的**塊或者屬性,有且只會載入一次!!!)    第四步:main方法執行,列印beetle constructor。第五步:執行到beetle b = new beetle(),載入beetle無參構造方,因為考慮到有繼承,會直接進入super(),由於全域性變數有預設值的關係,所以列印static insect.x1 initialized.

i=0,j=0。

第五步:這一步很容易出錯,也很關鍵。當載入完基類的構造器後,程式跳出來不是回到派生類的構造器,而是回到派生類定義屬性的地方。載入完類的屬性才會再回到構造器載入完餘下的部分。列印static

beetle.k initialized,

static beetle.x2 initialized,k=47 j=39

小葉把**又改了一下:

class insect 

public insect()

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

static int printinit(string s)

}

public class beetle extends insect 

public beetle()

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

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

public static void main(string args)

}

跟上面的例子有兩個不同:原本的屬性使用了static修飾,派生類定義屬性的**放在了構造器**下面。執行了一下,列印出

static codes initialized!

static insect.x1 initialized

beetle static codes initialized!

static beetle.k initialized

static beetle.x2 initialized

beetle constructor

i=0,j=0

k=47

j=39

你做對了?

java的靜態初始化和動態初始化

package array public class array for int i 0 i 3 i system.out.println for int i 2 i 0 i system.out.println system.out.print b.length n 動態初始化 inta new ...

java初始化順序

1 父類靜態成員和靜態初始化塊 按在 中出現的順序依次執行 2 子類靜態成員和靜態初始化塊 按在 中出現的順序依次執行 3 父類例項成員和例項初始化塊 按在 中出現的順序依次執行 4 父類構造方法 5 子類例項成員和例項初始化塊 按在 中出現的順序依次執行 6 子類構造方法 public abstr...

java初始化順序

例如以下 package chapter5 public class demo1one public void printinfo public static void main string args 程式一開始先執行 private static string password 0721 這行 ...