【问题标题】:simple constructor excersise Java简单的构造函数练习 Java
【发布时间】:2021-01-20 05:12:01
【问题描述】:

我很难理解,为什么下面这种情况下A类构造函数输出41,B类构造函数输出40

class AK {
    AK(int i) {
        
        System.out.println("Cstr of A " + i);
    }
    AK(){
        
        System.out.println("Cstr of A()");
    }
}
class BK extends AK {
    BK(int i) { 
        super(i+1); 
        System.out.println("Cstr of B " + i);
    }
    
    
    BK(){
        System.out.println("Cstr of B()");
    }
    
    
}
class CK extends BK {
    
    CK(int i) {
        
        super(2 * i); 
        System.out.println("Cstr of C " + i);
    }
}
 
class Main {
    public static void main (String args[]) {
        new CK(20);
    }
}

输出: A 41 的 Cstr
B 40 的 Cstr
C 20 的 cstr

【问题讨论】:

    标签: java inheritance constructor super


    【解决方案1】:

    main() 中,您创建一个带有整数 20 作为参数的对象 CK。 CK 的构造函数使用 2 * 参数 (= 40) 调用其 BK 的超级构造函数。 BK 的构造函数也在调用它的超级构造函数,参数为 + 1 ( = 41)。

    每个构造函数都在打印它的整数参数值。构造函数首先打印其结果,因为它是自其他构造函数调用它以来第一个完成的构造函数。

    使用参数 20 => i = 20 调用 CK 构造函数
    用 i * 2 => i = 40 调用 BK 构造函数
    使用 i + 1 => i = 41 调用 AK 构造函数

    而且 i 永远不会被重新分配,因此它的值会保持原样保留在另一个构造函数中。

    【讨论】:

      【解决方案2】:

      main() 方法中,当您创建CK 对象时,jre 会调用构造函数链接,该链接将调用main() -> CK(20) -> BK(40)-> AK(41)。

      当您调用 CK(20) 构造函数时,它会调用值为 2 的 super(2i)=BK(int i)=BK(40) 构造函数i=2*20。 当 BK(int i) 构造函数调用值为 40 时,它调用 super(i+1)=AK(int i)=AK(41) 值为 i+1=40+1。

      由于您在 BK() 中打印值 i 而不是 i+1,因此它会打印 40 而不是 41。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-01-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多