为什么程序会打印高度值0而不是我设置的高度值?

str*_*cha 6 java oop inheritance constructor output

我对在运行时如何调用方法和构造函数感到困惑,因为派生的构造函数被打印3次,高度被打印0

我试过在方法和构造函数中打印一些消息,以了解到底发生了什么

public class Derived extends Base{
    public static void main(String args[]){
        System.out.println("Hello World");
        Derived d = new Derived();
    }

    protected Derived(){
        System.out.println("Inside Derived Const");
        showAll();
    }

    protected void showAll(){
        System.out.println("Inside Derived showAll");
        System.out.println(getClass().getName()+" : "+height);
    }

    double height = 106.0;
}

class Base{

    protected Base(){
        System.out.println("Inside Base Const");
        showAll();
    }

    protected void showAll(){
        System.out.println("Inside Base showAll");
        System.out.println(getClass().getName()+" : "+height);
    }

    double height = 196.0;
}
Run Code Online (Sandbox Code Playgroud)

我期望输出是

Hello world
Derived : 106
Base : 196
Run Code Online (Sandbox Code Playgroud)

相反,我越来越

Hello World
Inside Base Const
Inside Derived showAll
Derived : 0.0
Inside Derived Const
Inside Derived showAll
Derived : 106.0
Run Code Online (Sandbox Code Playgroud)

ישו*_*ותך 5

这是因为您DerivedBase类派生了该类,并隐藏了变量并覆盖了方法。

每当使用以下方法实例化Derived类时,就在调用Base类的构造函数:

Derived d = new Derived();
Run Code Online (Sandbox Code Playgroud)

在调用上面的代码时,会发生以下情况:

  • 基类的构造函数Base()称为
  • 然后"Inside Base Const"被打印
  • showAll()未调用方法,因为它已被覆盖。方法showAll()内部Derived类被称为相反,
  • "Inside Base showAll" 打印
  • "Derived : 106.0"之所以被打印,是因为double height = 196.0;基类double height = 106.0;内部被Derived该类内部遮蔽了。