super是java中用于访问父类成员的关键字:构造方法中必须首行调用super()或super(参数),普通方法中可用super.成员名访问被隐藏的父类字段或方法,但不能访问private成员。

super 是 Java 中用于在子类中访问父类成员(包括构造方法、字段和方法)的关键字。它必须出现在子类构造方法的第一行,才能调用父类的构造方法;也可在普通方法或构造方法中用于访问被子类隐藏的父类成员。
调用父类构造方法
子类构造方法默认会隐式调用 super()(无参父类构造),但如果父类没有无参构造,或你想显式调用特定父类构造,则必须用 super(...) 并放在第一行。
- 若父类只有带参构造,子类构造中必须显式写 super(参数),否则编译失败
- super(...) 和 this(...) 不能共存于同一个构造方法中(二者都必须是首行)
- 不写 super() 时,编译器自动插入无参 super() —— 所以父类必须有可访问的无参构造,否则报错
示例:
class Animal {
String name;
Animal(String name) { this.name = name; }
}
class Dog extends Animal {
int age;
Dog(String name, int age) {
super(name); // ✅ 必须写,因 Animal 无无参构造
this.age = age;
}
}
访问父类被隐藏的字段或方法
当子类定义了与父类同名的字段或方法(非重写,而是隐藏或重载),可用 super.成员名 明确调用父类版本。
- super.field:访问父类中被子类同名字段遮蔽的字段(注意:静态字段也能用,但通常不推荐)
- super.method(...):调用父类中被重写(override)的方法,常用于在子类重写方法中复用父类逻辑
- 不能用 super 访问 private 父类成员(编译错误)
示例:
class Animal {
protected String type = "Animal";
void sound() { System.out.println("Some sound"); }
}
class Cat extends Animal {
String type = "Cat"; // 隐藏父类 type 字段
void show() {
System.out.println(super.type); // 输出 "Animal"
System.out.println(this.type); // 输出 "Cat"
}
@Override
void sound() {
super.sound(); // 复用父类逻辑
System.out.println("Meow!");
}
}
注意事项和常见误区
- super() 只能在构造方法中使用,且必须是第一句;普通方法中只能用 super.xxx 访问成员
- 构造方法链中,super(...) 最终会触发 Object 类的构造(隐式或显式)
- 不要混淆 super 和 this:前者指向父类部分,后者指向当前对象实例
- 接口中没有构造方法,所以 super 不能用于实现接口的类中调用“接口构造”(接口根本不能有构造)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











