如何解决简单的构造函数摘录Java
我很难理解,为什么在下面的这种情况下,为什么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
解决方法
在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(2 i)= BK(int i)= BK(40)构造函数,其值为2 i = 2 * 20。 当使用值40调用BK(int i)构造函数时,它将调用值i + 1 = 40 + 1的super(i + 1)= AK(int i)= AK(41)。
由于您要在BK()中打印值i而不是i + 1,所以它确实打印40而不是41。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。