在Java中,子类可以声明一个与父类同名的成员变量,这称为字段隐藏(Field Hiding); 如果子类中定义了一个与父类同名的成员变量,则会发生字段隐藏,而不是覆盖。这意味着子类中的同名成员变量会"遮蔽"掉父类中的那个变量,但这并不影响父类中原有成员变量的存在。但需要注意以下关键点:
核心规则:
-
允许声明同名变量:语法上完全允许子类定义与父类同名的成员变量。
-
独立存储 :父类和子类的同名变量是两个独立存储的变量,互不影响。
-
访问规则:
-
在子类方法中直接使用变量名时,默认访问的是子类自己的变量。
-
若需访问父类的同名变量,必须使用
super.变量名
(如super.c
)。
-
-
多态不适用 :字段访问不遵循多态规则,由引用类型决定访问哪个变量。
示例代码:
java
class Parent {
int c = 10; // 父类成员变量
}
class Child extends Parent {
int c = 20; // 子类隐藏父类的c
void print() {
System.out.println(c); // 20 (子类变量)
System.out.println(super.c); // 10 (父类变量)
}
}
public class Main {
public static void main(String[] args) {
Parent obj1 = new Child();
System.out.println(obj1.c); // 10 (引用类型为Parent,访问父类变量)
Child obj2 = new Child();
System.out.println(obj2.c); // 20 (引用类型为Child,访问子类变量)
}
}
总结:
场景 | 访问结果 |
---|---|
子类方法中直接写 c |
子类的变量 |
子类方法中写 super.c |
父类的变量 |
通过父类引用 Parent obj 访问 |
父类的变量(编译时决定) |
通过子类引用 Child obj 访问 |
子类的变量 |