Java 中的 super 关键字详解
super 是 Java 中的一个关键字,用于引用父类(超类)的成员,主要应用于继承关系中。它的核心用途包括:
-
访问父类的成员变量
-
调用父类的方法
-
调用父类的构造方法
1. 主要用途
(1) 访问父类的成员变量
当子类和父类有同名的成员变量时,使用 super 明确指定访问父类的变量。
class Animal {
String name = "动物";
}
class Dog extends Animal {
String name = "狗";
void printNames() {
System.out.println(name); // 输出 "狗"(子类的 name)
System.out.println(super.name); // 输出 "动物"(父类的 name)
}
}
public class Main {
public static void main(String[] args) {
new Dog().printNames();
}
}
输出:
狗
动物
(2) 调用父类的方法
当子类重写(Override)了父类的方法时,可以用 super 调用父类的原始方法。
class Animal {
void eat() {
System.out.println("动物在吃东西");
}
}
class Dog extends Animal {
@Override
void eat() {
super.eat(); // 先调用父类的 eat()
System.out.println("狗在啃骨头");
}
}
public class Main {
public static void main(String[] args) {
new Dog().eat();
}
}
输出:
动物在吃东西
狗在啃骨头
(3) 调用父类的构造方法
在子类的构造方法中,super() 用于调用父类的构造方法,且必须放在子类构造方法的第一行。
class Animal {
Animal(String name) {
System.out.println("父类构造方法:" + name);
}
}
class Dog extends Animal {
Dog() {
super("旺财"); // 调用父类有参构造方法
System.out.println("子类构造方法");
}
}
public class Main {
public static void main(String[] args) {
new Dog();
}
}
输出:
父类构造方法:旺财
子类构造方法
2. 注意事项
-
super()必须放在子类构造方法的第一行
否则会编译报错:class Dog extends Animal { Dog() { System.out.println("子类构造方法"); super("旺财"); // 错误!super() 必须在第一行 } } -
子类构造方法中调用
super()(父类无参构造方法),但如果父类只有有参构造方法,子类必须手动调用: -
class Animal { Animal(String name) {} // 只有有参构造方法 } class Dog extends Animal { Dog() { super("默认名字"); // 必须显式调用 } } -
super不能用于静态方法
静态方法属于类而非对象,因此不能使用super。 -
super不能指向父类的父类(即不能链式调用super.super)
Java 不允许跨级访问祖父类的成员。
3. 常见面试问题
Q1:super 和 this 的区别?
| 关键字 | 指向目标 | 使用场景 |
|---|---|---|
this | 当前对象 | 访问本类的成员变量、方法、构造方法 |
super | 父类对象 | 访问父类的成员变量、方法、构造方法 |
Q2:为什么子类构造方法要调用 super()?
-
Java 要求子类必须先初始化父类(通过
super()),再初始化自身。 -
如果父类没有无参构造方法,子类必须显式调用
super(参数)。
Q3:能否在静态方法中使用 super?
不能。super 和 this 都依赖于对象实例,而静态方法属于类级别。
4. 总结
| 场景 | 代码示例 |
|---|---|
| 访问父类的成员变量 | super.name; |
| 调用父类的方法 | super.eat(); |
| 调用父类的构造方法 | super("参数"); |
super 的核心作用:在继承关系中,明确访问父类的成员,确保代码逻辑清晰。

656

被折叠的 条评论
为什么被折叠?



