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的值,即4
和4
。在
lights_on();
类中执行Car
方法时,JVM是否重新初始化该值?引用如何从bmwCar.lights_on
传递到Car
类lights_on
方法?我正在寻找有关工作流程的详细答案。 最佳答案
您在类wheels
中声明成员变量lights
和Vehicle
,然后在子类Car
和BMWCar
中声明具有相同名称的成员变量。
请注意,成员变量不会像方法那样被覆盖。子类中的成员变量将隐藏超类中的变量。
因此,没有一组成员变量-有三个!您将看到这三个方法之一,具体取决于您的方法位于哪个类中。超类的成员变量没有以某种方式重新初始化。在类lights_on
中的方法Car
中,您将看到类wheels
的变量lights
和Car
,其值分别为4和2。
应该避免使用与超类同名的成员变量,因为这很容易混淆,并且没有按照您的想象做。