super是java中用于子类访问父类成员和调用父类构造器的关键字,只能在非静态上下文中使用;子类构造器须显式调用super(...)若父类无无参构造器;super.可访问被隐藏或重写的父类成员。

super 是 Java 中用于在子类中访问父类成员(字段、方法)和调用父类构造器的关键字。它只能在子类的非静态上下文中使用,比如构造器、实例方法或实例初始化块里。
调用父类构造器
子类构造器默认会隐式调用 super()(无参父类构造器),但如果父类没有无参构造器,或你想显式调用特定父类构造器,就必须用 super(...) 且必须放在子类构造器的第一行。
- 如果父类只有带参构造器,子类构造器必须显式写 super(参数),否则编译失败
- super(...) 和 this(...) 不能共存于同一个构造器中(二者都必须是第一行)
- 示例:
class Parent { Parent(String name) { ... } }
class Child extends Parent {
Child() { super("default"); } // 必须显式调用
}
访问父类字段和方法
当子类中定义了与父类同名的字段或方法(即隐藏或重写),可用 super.成员名 明确访问父类版本。
- 对于被子类隐藏的字段(static 或非 private 实例字段),super.field 可读取父类该字段值
- 对于被子类重写的实例方法,super.method() 可调用父类实现(注意:不能用于 static 方法)
- 不能通过 super 访问父类 private 成员(编译错误)
- 示例:
class Parent { protected String info = "parent"; void show() { System.out.println("Parent"); } }
class Child extends Parent {
String info = "child";
void show() { System.out.println("Child"); }
void print() {
System.out.println(super.info); // 输出 "parent"
super.show(); // 输出 "Parent"
}
}
常见误区提醒
- super 不是一个对象引用,不能赋值给变量,也不能单独使用(如 super; 是非法的)
- 在静态方法或静态上下文中使用 super 会编译报错(因为 super 依赖于具体实例)
- 构造器中若没写 super(...),编译器自动插入 super();但若父类没有无参构造器,就会编译失败
- 子类继承时,即使不写任何 super,父类构造器仍会被调用——只是方式不同(隐式 vs 显式)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











