Java:類檔案程式執行順序
阿新 • • 發佈:2018-12-13
只要按照這個步驟,遇到這一類問題就可以解決了。
1.類中所有屬性的預設值(一舉而成)
2. 父類靜態屬性初始化,靜態塊,靜態方法的宣告(按出現順序執行)
3. 子類靜態屬性初始化,靜態塊,靜態方法的宣告 (按出現順序執行)
4. 呼叫父類的構造方法,
首先父類的非靜態成員初始化,構造塊,普通方法的宣告(按出現順序執行)
然後父類構造方法
5. 呼叫子類的構造方法,
首先子類的非靜態成員初始化,構造塊,普通方法的宣告(按出現順序執行)
然後子類構造方法
說明: 1-3:類載入過程,不涉及構造方法
1-5: 例項化過程,涉及構造方法
參考問題:執行下列程式碼,輸出是什麼?
class A {
public A() {
System.out.println("A的構造方法");
}
public static int j = print();
public static int print() {
System.out.println("A print");
return 521;
}
}
public class Test1 extends A {
public Test1() {
System. out.println("Test1的構造方法");
}
public static int k = print();
public static int print() {
System.out.println("Test print");
return 522;
}
public static void main(String[] args) {
System.out.println("main start");
Test1 t1 = new Test1();
}
}
看看是不是這個?如果是那麼執行順序掌握的不錯。
A print
Test print
main start
A的構造方法
Test1的構造方法
再來個上題加強版:問輸出順序是什麼?
public class Test1 extends A {
public Test1() {
System.out.println("Test1的構造方法");
}
public static int k = print();
{
System.out.println(k);
}
public static int print() {
System.out.println("Test print");
return 522;
}
public static void main(String[] args) {
System.out.println("main start");
Test1 t1 = new Test1();
Test1 t3;
Test1 t2 = new Test1();
}
}
class A {
public A() {
System.out.println("A的構造方法");
}
{
System.out.println(j);
}
public static int j = print();
static {
System.out.println(j);
}
public static int print() {
System.out.println("A print");
return 521;
}
static{
System.out.println("A的static block");
}
}
看看輸出是不是:
A print
521
A的static block
Test print
main start
521
A的構造方法
522
Test1的構造方法
521
A的構造方法
522
Test1的構造方法
重複輸出的部分:
521
A的構造方法
522
Test1的構造方法
來自於第二次new過程中:執行父類構造體與構造方法->子類構造體與構造方法
而且也可以看出 類的申明不會呼叫類的構造體