我记下了这个小程序:
一个
类:
public class A
{
public A()
{
System.out.println(getS());
}
public String getS() { return s;}
}
B
类:
public class B extends A
{
private String s = "hello2";
public String getS() { return s;}
}
主要
:
public static void main(String[] args)
{
B b = new B();
}
它打印了:
null
这是为什么?
我知道打印出来的String是B的字符串,但为什么之前没有初始化呢?
根据 this answer - 在构造函数之前初始化的变量..
编辑 - 我编辑了代码,这样不相关的代码就不会混淆了
最佳答案
事情是这样的:当你构造B
时,它的构造函数需要做的第一件事就是构造A
。这是在 B
自己的字段 s
初始化之前完成的。
A
构造自己的s
,然后调用getS
。但是,它没有获得自己的 getS
,因为 B
为其提供了覆盖。回想一下,B.s
还没有被初始化。这就是为什么您会看到打印出 null
的原因。
后续阅读:What's wrong with overridable method calls in constructors?
关于java - 构造函数什么时候初始化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42251560/