📅  最后修改于: 2023-12-03 15:16:32.451000             🧑  作者: Mango
在Java中,实例变量的隐藏是指当子类中定义了与父类中同名的实例变量时,子类中的实例变量会隐藏父类中的实例变量。这意味着,如果使用子类对象调用同名实例变量,将会访问子类中的实例变量而不是父类中的实例变量。
以下示例展示了继承关系中实例变量隐藏的现象:
class Parent {
public int age = 40;
}
class Child extends Parent {
public int age = 10;
}
public class Main {
public static void main(String[] args) {
Child child = new Child();
System.out.println(child.age); // 输出:10
Parent parent = (Parent) child;
System.out.println(parent.age); // 输出:40
}
}
在上述代码中,Child
类继承了 Parent
类,并定义了一个同名的实例变量 age
。在 main()
方法中,首先创建了 Child
类的实例 child
,并使用该实例访问 age
变量,这时输出的结果为子类中的 age
,即 10
。接着,将 child
强制转换成 Parent
类型的对象 parent
,并同样访问 age
变量,这时输出的结果为父类中的 age
,即 40
。
这是因为,当使用子类对象访问实例变量时,编译器会优先查找子类中是否有同名的实例变量,若有,则将其返回;若没有,则查找父类中是否有同名的实例变量,若有,则返回;若没有,则会抛出编译错误。
为了避免实例变量隐藏的问题,可以遵循以下规则:
super
关键字访问父类中的实例变量。以下示例展示了如何使用 super
关键字访问父类中的实例变量:
class Parent {
public int age = 40;
}
class Child extends Parent {
public int age = 10;
public void printAge() {
System.out.println(super.age); // 输出:40
}
}
public class Main {
public static void main(String[] args) {
Child child = new Child();
child.printAge();
}
}
在上述代码中,Child
类中定义了一个方法 printAge()
,该方法使用 super
关键字访问了父类中的实例变量 age
。在 main()
方法中,首先创建了 Child
类的实例 child
,然后调用了 printAge()
方法,该方法输出了父类中的 age
,即 40
。
Java中的实例变量隐藏是继承关系中的一个重要概念。遵循上述规则,能够避免实例变量隐藏的问题,从而确保继承关系中代码的正确性。