Dvi*_*aim 1 java string inheritance constructor initialization
我写下了这个迷你程序:
A 类:
public class A
{
public A()
{
System.out.println(getS());
}
public String getS() { return s;}
}
Run Code Online (Sandbox Code Playgroud)
B 类:
public class B extends A
{
private String s = "hello2";
public String getS() { return s;}
}
Run Code Online (Sandbox Code Playgroud)
main:
public static void main(String[] args)
{
B b = new B();
}
Run Code Online (Sandbox Code Playgroud)
并打印:
null
Run Code Online (Sandbox Code Playgroud)
这是为什么?
我知道打印的字符串是B的字符串,但为什么它之前没有初始化?
根据这个答案 - 在构造函数之前初始化的变量..
编辑 - 我编辑了代码,所以不相关的代码不会混淆
这是正在发生的事情:当你构造时B,它的构造函数需要做的第一件事是构造A.这是在B自己的字段s初始化之前完成的.
A构造自己的s,然后调用getS.但是,它没有自己的getS,因为B它提供了覆盖.回想一下B.s尚未初始化.这就是你看到null印刷的原因.
后续阅读:构造函数中的可覆盖方法调用有什么问题?