Java super 关键字
Java super 关键字详解
super 代表父类(超类)对象引用,仅存在子类中,用来访问父类的成员,和代表当前对象的 this 对应。
一、super 三种核心用法
1. super.成员变量:访问父类同名成员变量
子类和父类属性重名时,默认优先访问子类,用 super.属性 指定父类。
class Parent {
String name = "父类";
}
class Son extends Parent {
String name = "子类";
void show() {
System.out.println(name); // 子类(自身)
System.out.println(super.name); // 父类(super访问父类)
}
}
2. super.方法():调用父类重写前的方法
子类重写父类方法后,直接调用是子类自身实现;super.方法() 执行父类原始逻辑。
class Parent {
void say() {
System.out.println("父类说话");
}
}
class Son extends Parent {
@Override
void say() {
super.say(); // 先调用父类方法
System.out.println("子类说话");
}
}
3. super():调用父类构造方法
规则:
super()必须写在子类构造方法第一行;- 不写
super(),编译器默认隐式添加无参super(); - 父类只有有参构造,子类必须手动
super(参数),否则编译报错; super()和this()不能同时存在构造器,都要求放第一行。
class Parent {
String name;
// 有参构造
Parent(String name) {
this.name = name;
}
}
class Son extends Parent {
// 子类构造必须调用父类有参构造
Son() {
super("父类姓名"); // 必须第一行
}
}
二、super 与 this 对比
| 特性 | this | super |
|---|---|---|
| 含义 | 当前类对象引用 | 父类对象引用 |
| 访问变量 | 本类成员变量 | 父类成员变量 |
| 调用方法 | 本类方法 | 父类方法 |
| 构造调用 | this() 调用本类其他构造 |
super() 调用父类构造 |
| 使用位置 | 普通方法、构造方法 | 普通方法、构造方法 |
| 静态方法 | 不能使用 | 不能使用 |
三、关键注意事项
- 静态方法不能用 super / this
static 属于类,没有实例对象,super/this 依赖对象,编译报错。 - 构造器中
super()隐含调用顶层 Object
所有类直接/间接继承 Object,无参构造最终都会走到super()调用 Object 构造。 - 多层继承时,super 只直接访问直接父类,不能隔代访问爷爷类(需要爷爷类提供方法中转)。
- super 不能在静态代码块、静态方法中出现。
四、完整综合示例
// 父类
class Animal {
String type = "动物";
public Animal() {
System.out.println("父类无参构造");
}
public void run() {
System.out.println("动物奔跑");
}
}
// 子类
class Dog extends Animal {
String type = "小狗";
public Dog() {
super(); // 调用父类构造,可省略
}
@Override
public void run() {
System.out.println(this.type); // 子类变量
System.out.println(super.type); // 父类变量
super.run(); // 父类方法
System.out.println("小狗四条腿跑");
}
}
public class Test {
public static void main(String[] args) {
Dog dog = new Dog();
dog.run();
}
}
输出:
父类无参构造
小狗
动物
动物奔跑
小狗四条腿跑
五、常见面试考点
- 子类构造方法默认第一行隐式
super(); - 父类无无参构造,子类必须显式
super(实参); super()和this()互斥,不能共存;- super 只能在实例方法/构造器,static 中禁用;
- 方法重写后通过
super.方法()复用父类逻辑。

浙公网安备 33010602011771号