Java子类构造函数继承成员

标签 java constructor subclass superclass

我有一个问题,为什么这段代码在执行时会打印出值 0。我不完全理解 SubClass 构造函数中发生了什么,以及为什么当我删除被覆盖的方法 implicitValue 时,它打印出 10. SubClass 构造函数是否使用 SuperClass 构造函数? 谢谢。

class SuperClass {
    protected int superClassValue;

    public SuperClass() {
        superClassValue = implicitValue();
    }

    public int implicitValue() {
        return 10;
    }

    public int getValue() {
        return superClassValue;
    }
}

class SubClass extends SuperClass {
    private int subClassValue;

    public SubClass() {
        subClassValue = 20;

    }

    public int implicitValue() {
        return subClassValue;

    }
}

class Example {
    public static void main(String argv[]) {
        SubClass ss = new SubClass();
        System.out.println("The value is " + ss.getValue());

    }
}

最佳答案

长话短说

问题是 SubClass 中的 implicitValue 被父类(super class)隐式 SuperClass 构造函数(super())通过 implicitValue()< 使用 方法,在 subClassValue = 20; 之前会在 SubClass 构造函数中执行,所以它返回 subClassValue 的默认值,对于 int 字段是0


Does the SubClass constructor make use of the SuperClass constructor?

是的,开始时子类构造函数总是调用父类(super class)构造函数,所以代码

public SubClass() {
    subClassValue = 20;
}

相同
public SubClass() {
    super();//superclass constructor
    subClassValue = 20;
}

但是让我们看一下您的代码。您正在打印父类(super class)中存在的 getVlaue() 方法的结果

public int getValue() {
    return superClassValue;
}

如您所见,它返回 superClassValue 的值。在调用 getVlaue() 之前,您正在创建 ss 实例,因此您正在调用代码

super();//superclass constructor
subClassValue = 20;

这意味着你正在调用看起来像父类(super class)的构造函数

public SuperClass() {
    superClassValue = implicitValue();
}

所以 this.superClassValue 是用 implicitValue() 方法的返回值初始化的,但是因为 dynamic binding (后期绑定(bind))JVM 将尝试从 this 的实际类开始搜索此方法的实现,该类是 SubClass,并且由于此类有自己的覆盖版本,因此它将是调用

public int implicitValue() {
    return subClassValue;
}

但是 subClassValue 还没有设置任何值

super();// <-- we are still here
subClassValue = 20;// this line was not executed yet

所以 subClassValue 仍然有它的默认值 0,这意味着

superClassValue = implicitValue(); //will be initialized with 0;

所以

public int getValue() {
    return superClassValue;
}

将返回0

关于Java子类构造函数继承成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28099157/

相关文章:

java - 在 neo4j 中使用 jdbc 创建节点时出现问题

swift - 如何在 Swift 3 中创建 SKSpriteNode 的子类

javascript - 如何在构造函数之外调用 super 构造函数?

c++ - 我将如何使用调用相同构造函数的静态成员函数创建两个矩阵(所有值为 Ones 或值 Zeros)?

c++ - "Override"构造函数并调用祖 parent 构造函数

c++ - C++ 切片的潜在解决方法?

C# 覆盖/添加方法/字段到对象

java - 我们什么时候应该在 Java 中使用 Singleton 类?

java - 如何构建 JNI .dll?

java - 方法不返回字符串?