學而不精則淡,精而不用則廢。
了解包括繼承和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 這行 ...