2017-07-17 26 views
-5

包p1有3個類:保護,派生和SamePackage。 Protection類有4個變量,每個變量都使用唯一類型的訪問修飾符進行定義。每個後續類嘗試訪問此類實例中的變量。爲什麼Protection()構造函數被執行多次? (特別是,基礎構造函數在輸出開始時執行了兩次)

package p1; 
public class Protection { 
    int n = 1; 
    private int n_pri = 2; 
    protected int n_pro = 3; 
    public int n_pub = 4; 
    public Protection() { 
     System.out.println("base constructor"); 
     System.out.println("n = " + n); 
     System.out.println("n_pri = " + n_pri); 
     System.out.println("n_pro = " + n_pro); 
     System.out.println("n_pub = " + n_pub); 
    } 
} 
//This is file Derived.java: 
package p1; 
class Derived extends Protection { 
    Derived() { 
     System.out.println("derived constructor"); 
     System.out.println("n = " + n); 
     // class only 
     // System.out.println("n_pri = "4 + n_pri); 
     System.out.println("n_pro = " + n_pro); 
     System.out.println("n_pub = " + n_pub); 
    } 
} 

//This is file SamePackage.java: 
package p1; 
class SamePackage { 
    SamePackage() { 
     Protection p = new Protection(); 
     System.out.println("same package constructor"); 
     System.out.println("n = " + p.n); 
     // class only 
     // System.out.println("n_pri = " + p.n_pri); 
     System.out.println("n_pro = " + p.n_pro); 
     System.out.println("n_pub = " + p.n_pub); 
    } 
} 
//Test File 
// Demo package p1. 
package p1; 
// Instantiate the various classes in p1. 
public class Demo { 
    public static void main(String args[]) { 
     Protection ob1 = new Protection(); 
     Derived ob2 = new Derived(); 
     SamePackage ob3 = new SamePackage(); 
    } 
} 

base constructor 
n = 1 
n_pri = 2 
n_pro = 3 
n_pub = 4 
base constructor 
n = 1 
n_pri = 2 
n_pro = 3 
n_pub = 4 
derived constructor 
n = 1 
n_pro = 3 
n_pub = 4 
base constructor 
n = 1 
n_pri = 2 
n_pro = 3 
n_pub = 4 
same package constructor 
n = 1 
n_pro = 3 
n_pub = 4 
+0

您是否期待其他結果?爲什麼? – Pshemo

回答

1

保護構造函數將被執行多次得到以下輸出,因爲實例化保護的多個對象。

每次您撥打new Protection(); Protection構造函數都會運行。

您在Demo中先調用它,然後實例化Derived,並且由於Derived擴展了Protection,所以Protection構造函數被再次調用。最後當你實例化SamePackage和SamePackage實例化保護時,構造函數被第三次調用。

我希望這是可以理解的...

+0

感謝您的解釋... 我有一個額外的疑問: 爲什麼基礎構造函數在輸出開始時執行兩次? –

+0

因爲你首先實例化Protection(第一個輸出),然後派生。因爲Derived擴展了Protection,所以Protection構造函數首先被執行,然後被Derived構造函數執行。 – Wernerson

+0

知道了...非常感謝你 –

相關問題