简单的构造函数练习 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。
我很难理解,为什么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
而且 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。