简单构造函数练习Java

简单构造函数练习Java,java,inheritance,constructor,super,Java,Inheritance,Constructor,Super,我很难理解为什么在下面的例子中,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

我很难理解为什么在下面的例子中,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);
    }
}
输出: 一个41的Cstr
B 40的Cstr
Cstr的c20

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

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

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

此外,我从未被重新赋值,因此它的值仍保持在另一个构造函数中。

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

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

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

此外,我从未被重新分配,因此它的值仍保持在另一个构造函数中。

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

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

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

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

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

因为您是在BK()中打印值i,而不是i+1,所以它会打印40而不是41