綜合:先載入類(靜態欄位及靜態**塊)->(若有則執行主函式main)->預設初始化域-》執行構造方法(隱式初始化域和**塊,再執行構造器的主體)-
>呼叫方法
4 執行子類的建構函式,建構函式來執行初始化。其中子類的建構函式
第一件事是呼叫基類的建構函式。(
第二件事是
隱式初始化域和**塊
。接著才是執行構造器的主體。
**:子類的構造器中第一件事就是呼叫基類構造器。
class classone
int t;
classone(int i)
}class classtwo extends classone
int m;
classtwo(int i)
}public class classthree extends classtwo
public classthree(int i)
public static void main(string args)
結果:classone靜態塊
classtwo靜態塊
classthree靜態塊
--------建立classtwo物件
t自動初始化完畢,結果為:0
classone非靜態塊
classone構造器 及t的值 1 i=2
m自動初始化完畢,結果為:0
classtwo非靜態塊
classtwo構造器 及m 5
import static net.mindview.util.print.*;
class glyph
glyph()
}class roundglyph extends glyph
roundglyph(int r)
void draw()
}public class polyconstructors
}
結果:
靜態**塊 t=:1
glyph() before draw()
預設初始化 radius = 0
glyph() after draw()
非靜態**塊
初始化radius=:1
賦值radius = 5
到此為止,單一類初始化順序為:
1:載入類(static 域和static**塊)
2:執行main方法(static方法)
3:預設初始化域(**塊沒有預設初始化)為0或其他null之類
4:執行建構函式(先隱式初始化域和**塊,再執行構造器主體)
繼承類初始化順序:
1:先載入類的成員(先基類再子類)(靜態域和靜態塊)
2 :再執行main方法(static方法)
3:預設初始化域
4:建立子類的物件時,呼叫子類建構函式,(遞迴呼叫基類建構函式,當基類建構函式
執行完畢
之後),隱式初始化域和**塊,再執行子類建構函式剩下的部分。
可知順序:
1:先載入類的成員(先基類再子類)(靜態域和靜態塊)
2 :再執行main方法
3:建立子類的物件時,呼叫子類建構函式,(遞迴呼叫基類建構函式,當基類建構函式執行完畢之後),執行子類建構函式剩下的部分。
類的載入和初始化順序
靜態變數,靜態塊 按文字順序載入 非靜態變數,非靜態塊 按文字順序載入 構造器 靜態 塊不能在 靜態 變數宣告之前應用它。對於繼承關係中的類的初始化 父類靜態變數,父類靜態塊 子類靜態變數,子類靜態塊 父類非靜態變數,父類非靜態塊 父類構造器 子類非靜態變數,子類非靜態塊 子類構造器 如果在靜態塊中...
變數初始化順序
1 變數定義的先後順序決定初始化順序,即使變數定義散布在方法定義之間,他們仍舊會在方法被呼叫之前得到初始化,構造方法也是特殊的方法 2 執行順序 靜態塊,靜態變數,非靜態變數,構造方法 每次在建立物件的時候非靜態變數都會被初始化 靜態物件只會在類載入的時候被初始化一次 public class in...
類初始化順序
類初始化時,jvm會先初始化所有 1,靜態屬性,靜態例項,靜態塊。2.新建例項 靜態或非靜態 時會先執行所有非靜態屬性和構造塊 非靜態屬性和構造塊執行級別相同,誰前誰先 然後構造方法。注意 1 靜態 塊不能存在於任何方法體內。2 靜態 塊不能直接訪問靜態例項變數和例項方法,需要通過類的例項物件來訪問...