简单构造函数练习Java
我很难理解为什么在下面的例子中,A类构造函数输出41,B类构造函数输出40简单构造函数练习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
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的CstrB 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