Instance Variable Hiding in Java

2025年5月2日 | 阅读3分钟

实例变量隐藏仅发生在子类定义了一个与其父类中的变量同名的变量时。当子类实例访问该变量时,将使用子类的变量。仍然可以使用 super 关键字访问父类的变量。

程序 1:基本实例变量隐藏

文件名: InstanceVariable.java

输出

 
Dog's name: Dog
Animal's name using super: Animal   

说明:该程序演示了实例变量隐藏,其中子类变量的名称与其父类中的变量相同,从而隐藏了父类的变量。Dog 子类定义了一个 name 变量,该变量隐藏了 Animal 父类中的 name 变量。直接在 Dog 中访问 name 时,它引用的是 Dog 变量,而不是 Animal 变量。但是,仍然可以使用 super 关键字来访问父类的 name。

程序 2:带方法重写的实例变量隐藏

文件名: InstanceVariableMethodOverriding.java

输出

 
Car's max speed: 180
Vehicle's max speed using super: 120   

说明:该程序演示了实例变量隐藏,其中子类 Car 定义了一个 maxSpeed 变量,该变量隐藏了其父类 Vehicle 中的 maxSpeed 变量。当 Car 重写 printMaxSpeed 方法时,它使用 super.maxSpeed 同时访问自己的 maxSpeed 和父类的 maxSpeed。此示例强调了变量隐藏的工作原理,因为除非显式引用 super(访问父类变量),否则将使用 Car 的 maxSpeed。

程序 3:带静态变量的实例变量隐藏

文件名: InstanceVariableStatic.java

输出

 
Circle's type: Circle
Shape's type using superclass reference: Shape   

说明:该程序演示了Java中带静态变量的实例变量隐藏,其中子类定义了一个与其父类中的变量同名的静态变量。在此示例中,Circle 通过声明一个同名的静态变量来隐藏 Shape 父类中的静态 type 变量。当在 Circle 实例上调用 printType() 时,直接访问 Circle 中的 type 变量,但仍然可以使用方法中的 Shape.type 来访问 Shape 类的 type。