简单的构造函数练习 Java

simple constructor excersise Java

我很难理解,为什么class A构造函数输出41,class 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

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

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

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

调用 AK 构造函数

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

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

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

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