在 Java 中,**“超类变量”**通常有两种理解,下面分别说明,并给出访问方式。
如果父类的变量不是 private,子类可以直接访问:
class Animal {
protected String name = "动物";
}
class Dog extends Animal {
void show() {
System.out.println(name); // 直接访问超类变量
}
}
private 变量不能被子类直接访问,必须通过:
class Animal {
private String name;
public String getName() {
return name;
}
}
class Dog extends Animal {
void show() {
System.out.println(getName());
}
}
当子类和父类有同名变量时,子类变量会“隐藏”父类变量:
class Animal {
String type = "animal";
}
class Dog extends Animal {
String type = "dog";
void show() {
System.out.println(type); // dog
System.out.println(super.type); // animal(访问超类变量)
}
}
✅ 使用 super.变量名 访问被隐藏的父类变量
Animal a = new Dog();
AnimalAnimal 中定义的变量class Animal {
String name;
}
class Dog extends Animal {
String breed;
}
Animal a = new Dog();
a.name = "Tom"; // ✅
// a.breed = "Lab"; // ❌ 编译错误
如果必须访问,需要向下转型:
if (a instanceof Dog) {
Dog d = (Dog) a;
d.breed = "Lab";
}
class Animal {
static int count = 0;
}
class Dog extends Animal {
void show() {
System.out.println(Animal.count); // 推荐
System.out.println(count); // 也可
}
}
| 场景 | 访问方式 |
|---|---|
| 父类非 private 变量 | 直接访问 |
| 父类 private 变量 | getter / setter |
| 同名变量隐藏 | super.变量 |
| 超类引用指向子类 | 只能访问超类变量 |
| 静态变量 | 类名.变量 |
如果你指的是 “反射访问超类变量”、“泛型超类” 或 “抽象类变量”,可以告诉我,我可以继续深入讲。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。