Java語言基礎:對象的初始化 – JAVA編程語言程序開發技術文章

1.  如果基類存在默認構造函數,則在子類構造之前,會先調用基類的默認構造函數:


view plaincopy to clipboardprint?
class A {  
    A() {  
        System.out.println(“A create”);  
    }  
}  
   
class B extends A {  
    B() {  
        // 會在這裡先調用A的默認構造函數  
        System.out.println(“B create”);  
    }  
}  
   
class C extends A {  
    C(int i) {  
        // 會在這裡先調用A的默認構造函數  
        System.out.println(“C create”);  
    }  
}  
   
public class Main {              
    public static void main(String[] args) {  
        B b = new B();  
        C c = new C(10);  
    }  
}  
   
// 輸出為:  
A create  
B create  
A create  
C create 
class A {
    A() {
        System.out.println(“A create”);
    }
}
 
class B extends A {
    B() {
        // 會在這裡先調用A的默認構造函數
        System.out.println(“B create”);
    }
}
 
class C extends A {
    C(int i) {
        // 會在這裡先調用A的默認構造函數
        System.out.println(“C create”);
    }
}
 
public class Main {           
    public static void main(String[] args) {
        B b = new B();
        C c = new C(10);
    }
}
 
// 輸出為:
A create
B create
A create
C create
 


2.  如果基類隻有帶參數的構造函數,子類必須在自己的構造函數中通過super(…)顯式調用該基類構造函數:


view plaincopy to clipboardprint?
class A {  
    A(int i) {  
        System.out.println(“A create”);  
    }  
}  
   
class B extends A {  
    B() {  
        // 必須在這裡顯式調用父類的非默認構造函數,否則編譯不通過  
        // 註意這調用隻能放在最前面,否則編譯不通過  
        super(20);  
        System.out.println(“B create”);  
    }  
}  
   
class C extends A {  
    C(int i) {  
        // 必須在這裡顯式調用父類的非默認構造函數,否則編譯不通過  
        // 註意這調用隻能放在最前面,否則編譯不通過  
        super(30);  
        System.out.println(“C create”);  
    }  
}  
   
public class Main {              
    public static void main(String[] args) {  
        B b = new B();  
        C c = new C(10);  
    }  
}  
// 輸出為:  
A create  
B create  
A create  
C create 
class A {
    A(int i) {
        System.out.println(“A create”);
    }
}
 
class B extends A {
    B() {
        // 必須在這裡顯式調用父類的非默認構造函數,否則編譯不通過
        // 註意這調用隻能放在最前面,否則編譯不通過
        super(20);
        System.out.println(“B create”);
    }
}
 
class C extends A {
    C(int i) {
        // 必須在這裡顯式調用父類的非默認構造函數,否則編譯不通過
        // 註意這調用隻能放在最前面,否則編譯不通過
        super(30);
        System.out.println(“C create”);
    }
}
 
public class Main {           
    public static void main(String[] args) {
        B b = new B();
        C c = new C(10);
    }
}
// 輸出為:
A create
B create
A create
C create
 


3.  以上隻講瞭最簡單的構造函數調用順序,其實一個對象的真正的初始化過程應該是:


將對象的存儲空間初始化為二進制的0.
先遞歸到最上層的基類去,將最上層的基類作為當前類。
對於當前類:
按聲明順序調用成員變量的初始設置代碼。
調用構造函數。
接著將下一層繼承類作為當前類,繼續步驟3
先看下面的代碼:


view plaincopy to clipboardprint?
class A {  
    A() {  
        System.out.println(“A create”);  
    }  
}  
   
class D {  
    D() {  
        System.out.println(“D create”);  
    }  
}  
   
class B extends A {  
    private D d = new D();  
    B() {  
        System.out.println(“B create”);  
    }  
}  
   
class C extends B {  
    C(int i) {  
        System.out.println(“C create”);  
    }  
}  
   
public class Main {              
    public static void main(String[] args) {  
        C c = new C(10);  
    }  

class A {
    A() {
        System.out.println(“A create”);
    }
}
 
class D {
    D() {
        System.out.println(“D create”);
   

發佈留言