为什么第一个System.out.println不会打印10的值?它打印一个0.首先创建一个新的Child对象,它调用Parent中的构造函数。由于动态绑定,Parent中的构造函数调用Child中的查找。那么为什么Child中的查找返回零而不是十?
public class Main332 {
public static void main(String args[]) {
Child child = new Child();
System.out.println("child.value() returns " + child.value());//Prints 0
Parent parent = new Child();
System.out.println("parent.value() returns " + parent.value());//Prints 0
Parent parent2 = new Parent();
System.out.println("parent2.value() returns " + parent2.value());//Prints 5
}
}
public class Child extends Parent {
private int num = 10;
public int lookup() {
return num;
}
}
public class Parent {
private int val;
public Parent() {
val = lookup();
}
public int value() {
return val;
}
public int lookup() {
return 5;// Silly
}
}
答案 0 :(得分:3)
在num
中构造函数调用之后,Child
中Parent
的字段初始值设定项执行。因此lookup()
返回0,因此Parent.val
设置为0。
要观察此情况,请更改Child.lookup()
以打印出要返回的内容。
有关创建新实例时执行顺序的详细信息,请参阅section 12.5 of the Java Language Specification。