java - 构造函数什么时候初始化?

标签 java string inheritance constructor initialization

我记下了这个小程序:

一个类:

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/

相关文章:

java - 正则表达式: Find pattern in string

基于模板的派生类和可变参数的 C++ 构造函数

c++ - 使用后期绑定(bind)从非私有(private)上下文调用私有(private)方法

Java同步

`System.out.println()` 方法调用上的 Java 语法错误

java - 简单的 Java 碰撞检测

c# - 在最大化代码重用的同时使用 C# 接口(interface)

java - 如何通过单击按钮打开已安装的应用程序抽屉android

c# - 环境换行和替换

在 C 中连接字符串