在下面的代码中,myString始终初始化为null。我必须手动初始化init()或类似的。据我所知,它与超类/子类有关,但我不明白确切的机制
public class A extends B {
private String myString = "test";
public static void main(String[] args) {
new A();
}
public A() {
super();
}
public void c() {
System.out.println(myString);
}
}
public class B {
public B() {
c();
}
public void c() {
}
}
答案 0 :(得分:3)
您的代码存在的问题是,myString
在类A
的构造函数的开头初始化,而在超级构造函数之后(即类{{1} }})。由于您之前从类B
的构造函数访问变量(间接通过调用重写方法B
),因此会出现此行为。
根据经验:如果你想避免意外行为,在构造函数执行之前不要调用overriden方法。
答案 1 :(得分:0)
在完全创建对象后立即调用c();
重写方法,并完成对超类构造函数的调用。
将您的代码更改为此..
public class A extends B {
private String myString = "test";
public static void main(String[] args) {
new A();
}
public A() {
super();
c(); // Include the call to c(); here ...
}
public void c() {
System.out.println(myString);
}
}
public class B {
public B() {
}
public void c() {
}
}
// Output : test
答案 2 :(得分:0)
Bruce Eckel在Java第二版中的思考,多态方法的行为 内部构造函数(p.337-339)。