📜  Java中的实例变量隐藏(1)

📅  最后修改于: 2023-12-03 15:16:32.451000             🧑  作者: Mango

Java中的实例变量隐藏

在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中的实例变量隐藏是继承关系中的一个重要概念。遵循上述规则,能够避免实例变量隐藏的问题,从而确保继承关系中代码的正确性。