class Vehicle {
    public int wheels;
    public int lights;
}

class Car extends Vehicle {
    public int wheels =4;
    public int lights =2;

    public void lights_on( int lights) {
        //Code to onlights
    }
}

class BMWCar extends Car {
     public int wheels = 4;
     public int lights = 4;
}

public class TestCar {
    public static void main(String args[]) {
        //Creating a new instance of BMWCAR by calling the default
        // constructor provided by the constructor

        bmwCar = new BMWCAR();
        bmwCar.lights_on();
    }
}


在上面的示例中,当我运行TestCar.java文件时,JVM的类加载器将TestCar文件加载到方法区域中,并执行main方法。创建bmwCar实例时,它将调用BMWCar类的默认构造函数并执行super构造函数,该构造函数是Car类的默认构造函数。我想知道为什么在调用bmwCar.lights_on();方法时,JVM会查找lights_on方法,并且在bmwCar对象中它会初始化实例变量wheel和light的值,即44

lights_on();类中执行Car方法时,JVM是否重新初始化该值?引用如何从bmwCar.lights_on传递到Carlights_on方法?我正在寻找有关工作流程的详细答案。

最佳答案

您在类wheels中声明成员变量lightsVehicle,然后在子类CarBMWCar中声明具有相同名称的成员变量。

请注意,成员变量不会像方法那样被覆盖。子类中的成员变量将隐藏超类中的变量。

因此,没有一组成员变量-有三个!您将看到这三个方法之一,具体取决于您的方法位于哪个类中。超类的成员变量没有以某种方式重新初始化。在类lights_on中的方法Car中,您将看到类wheels的变量lightsCar,其值分别为4和2。

应该避免使用与超类同名的成员变量,因为这很容易混淆,并且没有按照您的想象做。

10-02 04:55