构造函数何时初始化?

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的字符串,但为什么它之前没有初始化?

根据这个答案 - 在构造函数之前初始化的变量..

编辑 - 我编辑了代码,所以不相关的代码不会混淆

das*_*ght 5

这是正在发生的事情:当你构造时B,它的构造函数需要做的第一件事是构造A.这是在B自己的字段s初始化之前完成的.

A构造自己的s,然后调用getS.但是,它没有自己的getS,因为B它提供了覆盖.回想一下B.s尚未初始化.这就是你看到null印刷的原因.

后续阅读:构造函数中的可覆盖方法调用有什么问题?