2017-07-17 3 views
-5

パッケージp1には、Protection、Derived、およびSamePackageの3つのクラスがあります。 Protectionクラスには、アクセス修飾子の一意の型でそれぞれ定義された4つの変数があります。各クラスは、このクラスのインスタンス内の変数にアクセスしようとします。なぜProtection()コンストラクターが複数回実行されていますか? (特に、出力の初めにベースコンストラクタが2回実行される)

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コンストラクタが実行されます。

デモで最初に呼び出すとDerivedをインスタンス化し、Derivedは保護を拡張してから保護コンストラクタがもう一度呼び出されるようにします。最後に、SamePackageをインスタンス化し、SamePackageがProtectionをインスタンス化するとき、コンストラクタは3回目に呼び出されます。

私はこれが理解できるといいですね...

+0

説明のおかげで... 私はさらに疑問があります: なぜ出力の始めにベースコンストラクタが2回実行されるのですか? –

+0

最初にProtection(最初の出力)をインスタンス化してDerivedを実行するためです。 DerivedはProtectionを拡張するため、Protectionコンストラクタが最初に実行され、Derivedコンストラクタが次に実行されます。 – Wernerson

+0

入手しました...ありがとうございました –

関連する問題