2017-07-17 54 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

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