先上桌結論:
父類靜態屬性(成員變數) > 父類靜態**塊 > 子類靜態屬性 > 子類靜態**塊 > 父類非靜態屬性 > 父類非靜態**塊 > 父類構造器 > 子類非靜態屬性 > 子類非靜態**塊 > 子類構造器
這麼長怎麼記呀?!
靜態屬性和**塊,當且僅當該類在程式中第一次被 new 或者第一次被類載入器呼叫時才會觸發(不考慮永久代的**)。也正是因為上述原因,類優先於物件載入/new,即靜態優先於非靜態。
屬性(成員變數)優先於構造方法,可以這麼理解,載入這整個類,需要先知道類具有哪些屬性,並且這些屬性初始化完畢之後,這個類的物件才算是完整的。另外,非靜態**塊其實就是物件 new 的準備工作之一,算是乙個不接受任何外來引數的構造方法。因此,屬性 > 非靜態**塊 > 構造方法。
有趣的是,靜態部分(前4個)是父類 > 子類,而非靜態部分(後6個)也是父類 > 子類。
另外容易忽略的是,非靜態**塊在每次 new 物件時都會執行,可以理解:非靜態**塊是正式構造方法前的準備工作(非靜態**塊 > 構造方法)。
/**
* @author lean.li
* @date 2018/10/15
*/public class main
public a()
}static class b extends a
public b()
}static class hi
}public static void main(string args)
}
執行結果如下:
初次 new b:
hi a
a static
hi b
b static
hi a2
aaaa init
hi b2
bbbb init
第二次 new b:
hi a2
aaaa init
hi b2
bbbb init
父子類以及static的載入順序
static可以被寫在變數和 塊上,此時該變數和 塊不屬於物件,而屬於類,會在jvm執行類載入機制時的準備階段就被賦值以及執行,而非static的變數和 塊在初始化階段才會被賦值並執行。因此如果問靜態方法能否呼叫非靜態變數,答案是不能,因為後者在前者執行時還沒有初始化。通過結果,可以看到父子類的初始...
Java面試之父子類(3) 構造方法順序
在檢視答案之前,先猜測一下正確答案吧!package com.company class parentclass public parentclass string name static public class subclass extends parentclass public subcla...
Java中父類和子類載入順序
最近在總結一些和jvm相關的知識,現在總結一下關於父類和子類載入順序的問題。簡而言之就是先靜態後非靜態,先父類後子類,具體順序如下 父類靜態變數 父類靜態 塊 若有多個按 先後順序執行 子類靜態變數 子類靜態 塊 若有多個按 先後順序執行 父類非靜態變數 父類非靜態 塊 若有多個按 先後順序執行 父...