初始化成员时使用java?
考虑以下类:
public class A {
String bar = "A.bar";
A() { foo(); }
public void foo() {
System.out.println("A.foo(): bar = " +
bar);
}
}
public class B extends A {
String bar = "B.bar";
B() { foo(); }
public void foo() {
System.out.println("B.foo(): bar = " +
bar);
}
}
public class C {
public static void main(String[]
args) {
A a = new B();
System.out.println("a.bar = "
+ a.bar);
a.foo();
}
}
现在,打印的第一行是:B.foo(): bar = null
。据我所知,成员初始化在构造函数之前,但我可以看到这里的情况并非如此
为什么在这个阶段B#bar
没有初始化
isB#bar
何时初始化
谢谢
更新:
在阅读了你的答案后,请看一下这个反例:
public class Bazz {
public int a = 42;
public Bazz() {
System.out.println(a);
}
public static void main(String[] args) {
Bazz bazz = new Bazz();
}
}
在这种情况下,a
不是0
。相反,Bazz()
的构造函数打印42
有什么区别
# 1 楼答案
命令如下:
A.bar
A
的构造函数B.bar
B
的构造函数请注意
bar
inA
与B
中的bar
是不同的变量。因为A
的构造函数调用了一个重写的方法,所以这个方法可以在初始化前访问B
中的实例变量