super用于访问父类成员和构造器:构造器中必须首行调用super(...),若父类无无参构造器则必须显式调用;可访问被覆盖方法或隐藏字段,但不能用于static上下文或访问private成员。

在 Java 继承中,super 关键字用于显式访问父类的成员(字段、方法)和构造方法。它必须出现在子类构造方法的第一行(调用父类构造器),或在任意非静态方法中(访问父类成员)。关键在于:不写 super(...) 时,编译器会自动插入无参的 super();但若父类没有无参构造器,就必须手动写 super(参数),否则编译失败。
调用父类构造方法
子类构造器默认会调用父类无参构造器,但前提是父类存在该构造器。一旦父类只定义了带参构造器,子类就必须显式使用 super(...) 调用其中一个,且必须是构造器中的第一条语句。
- 若父类有无参构造器:
super()可省略(编译器自动补上) - 若父类只有带参构造器:子类构造器第一行必须写
super(实参),否则报错 “Implicit super constructor ... is undefined” -
super(...)和this(...)不能共存于同一构造器中——二者都必须是首行,冲突
访问父类被覆盖的方法或隐藏的字段
当子类重写了父类方法(override)或定义了同名字段(hide),可用 super.方法名() 或 super.字段名 显式调用/访问父类版本,避免歧义。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 调用被重写的方法:
super.toString()可在子类toString()中复用父类逻辑 - 访问被隐藏的字段:
super.name获取父类中同名但未被继承覆盖的字段值(注意:字段不具有多态性,只是名称遮蔽) - 不能在 static 方法或 static 上下文中使用
super——因为super指向运行时父类实例,而 static 属于类本身
常见误区与限制
super 不是对象引用,不能赋值给变量,也不能作为方法返回值;它仅用于限定访问父类成员。
-
super不能在构造器之外的静态上下文中使用(如 static 方法、static 块) -
super()只能在构造器中调用,且只能出现一次,且必须是第一行 - 不能通过
super访问父类 private 成员——private 对子类不可见,即使加super.也会编译报错 - 多层继承中,
super总是指直接父类,不是最顶层祖先类
一个典型示例
假设父类 Animal 有带参构造器,子类 Dog 必须显式调用:
class Animal {
protected String name;
public Animal(String name) { this.name = name; }
}
class Dog extends Animal {
public Dog(String name) {
super(name); // 必须写!否则编译错误
System.out.println("Dog created: " + name);
}
@Override
public String toString() {
return "Dog[" + super.name + "]"; // 访问父类字段
}
}
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










