Java子类构造函数继承的成员

Java子类构造函数继承的成员,java,constructor,subclass,superclass,Java,Constructor,Subclass,Superclass,我有一个问题,为什么这段代码在执行时会打印出值0。我不太明白子类构造函数中发生了什么,为什么当我删除被重写的方法implicitValue时,它会输出10。子类构造函数是否使用超类构造函数? 多谢各位 class SuperClass { protected int superClassValue; public SuperClass() { superClassValue = implicitValue(); } public int imp

我有一个问题,为什么这段代码在执行时会打印出值0。我不太明白子类构造函数中发生了什么,为什么当我删除被重写的方法implicitValue时,它会输出10。子类构造函数是否使用超类构造函数? 多谢各位

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());

    }
}

听起来您的重写方法或子类有问题。因为这听起来像是当它实现一个变量时,该值没有被实例化,所以它默认为0,然后当您删除它时,超类将接管,导致您得到值10。

是的,如果没有明确给出这样的调用,子类构造函数将隐式调用超类构造函数。但是它打印
0
,因为
implicitValue
方法在
子类中被重写

  • 调用超类构造函数。在这里,将创建对象的
    超类
    部分。所有变量都已初始化。由于没有给出显式值,编译器会给出
    superClassValue
    默认值
    0
    。然后,超类构造函数调用
    implicitValue()
    ,这将调用子类的方法。此方法返回
    超类值
    ,该值已初始化为
    0
    。此值显式分配回
    超类值
  • 子类将其
    子类值初始化为
    10
  • 调用
    getValue()
    方法,它返回
    superClassValue
    ,即
    0
    <代码>打印值为0时
  • 如果要删除
    子类
    中的
    隐式值
    方法,那么它将继承
    超类
    的方法版本,该方法返回
    10

    如果要修改
    子类
    中的
    隐式值
    方法以返回
    5
    ,那么它将初始化
    超类值
    5
    ,并打印
    值为5
    TL;博士

    问题是
    SubClass
    中的
    implicitValue
    由超类隐式超类构造函数(
    super()
    )通过
    implicitValue()
    方法在
    SubClass value=20之前使用
    将在子类构造函数中执行,因此它返回
    SubClass value
    的默认值,
    int
    字段的默认值为
    0


    子类构造函数是否使用超类构造函数

    是的,子类构造函数在开始时总是调用超类构造函数,所以代码

    public SubClass() {
        subClassValue = 20;
    }
    

    public SubClass() {
        super();//superclass constructor
        subClassValue = 20;
    }
    
    但是让我们看看你的代码。您正在打印超类中存在的
    getvlue()
    方法的结果

    public int getValue() {
        return superClassValue;
    }
    
    如您所见,它返回
    超类值的值。在调用
    getvlue()
    之前,您正在创建
    ss
    实例,因此您正在调用代码

    super();//superclass constructor
    subClassValue = 20;
    
    这意味着您正在调用超类的构造函数

    public SuperClass() {
        superClassValue = implicitValue();
    }
    
    因此,
    this.superClassValue
    使用返回值
    implicitValue()
    方法初始化,但由于(后期绑定),JVM将尝试从
    this
    的实际类开始搜索此方法的实现,该类是
    子类,由于该类有自己的重写版本,因此将调用它

    public int implicitValue() {
        return subClassValue;
    }
    
    但是
    子类值
    尚未设置为任何值

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

    将返回
    0

  • 在您的情况下:默认情况下将调用超类构造函数

  • 当Java进程:new SubClass()时。它将首先调用超类的构造函数。当调用超类的构造函数时,implicitValue()返回的值将分配给superClassValue-调用的方法implicitValue()是子类的方法(而不是如您所想调用SuperClass的implicitValue()-OOP的多态性特性)。调用子类的implicitValue()时,子类值尚未初始化(子类值=20;尚未运行),因此子类值仍然为零。这就是您在输出中看到零的原因

  • 移除子类中的override implicitValue时。调用的implicitValue()是SupperClass-->的implicitValue,这就是为什么在输出中看到10

  • superClassValue = implicitValue(); //will be initialized with 0;
    
    public int getValue() {
        return superClassValue;
    }