Java 的初始化順序
阿新 • • 發佈:2018-05-15
star 變量 [] extend 初始 system 輸出 color 默認值
初始化順序:
1.將對象內存空間初始化為二進制0(所有的數據成員被設為默認值)
2.如果該類有基類則初始化其基類(調用默認基類構造器,也可在子類構造器中指定調用基類的某個構造器)
3. 靜態成員和靜態域(誰在前誰先初始化,且在內存中只占一份空間,同一個類不同對象可以共享)
4.main方法
5.非靜態成員變量,引用,實例初始化 被初始化
6. 構造器
1,2,3,4為類加載過程,5,6為new對象過程,只有new會執行。
class A { A() { System.out.println("基類構造器"); System.out.println("證明數據成員被設為默認值"); draw(); } A(String s) { System.out.println(s); } void draw() { System.out.println("A.draw()"); } } public class Test extends A { int i = 5; Test() { System.out.println("子類構造器"); System.out.println("證明數據成員在構造器調用之前被初始化"); draw(); } String b= "非靜態成員"; A a = new A(b + "與非靜態引用"); { A b = new A("實例初始化"); } String c = "非靜態成員與實例初始化平級,誰在前先初始化誰"; A d = new A(c); void draw() { System.out.println("i = " + i); } static A start = new A("---類加載---"); static String e = "靜態成員"; static A f = newA(e + "和靜態引用"); static { A g = new A("靜態域"); } static String h = "靜態成員與靜態域平級,誰在前先初始化誰"; static A j = new A(h); public static void main(String[] args) { System.out.println("main執行"); System.out.println("---創建Test對象---"); Test k = new Test(); } }
輸出結果:
---類加載--- 靜態成員和靜態引用 靜態域 靜態成員與靜態域平級,誰在前先初始化誰 main執行 ---創建Test對象--- 基類構造器 證明數據成員被設為默認值 i = 0 非靜態成員與非靜態引用 實例初始化 非靜態成員與實例初始化平級,誰在前先初始化誰 子類構造器 證明數據成員在構造器調用之前被初始化 i = 5
Java 的初始化順序