super用于调用父类成员,可访问属性、方法和构造器。1. 子类重写方法后可用super.method()调用父类方法;2. 构造器中通过super()调用父类构造器,须位于首行;3. 子类同名字段隐藏父类字段时,用super.field访问父类属性;4. super不可在静态上下文中使用,且super()与this()不能共存于同一构造器首行。

在Java中,super关键字用于访问父类的成员,包括属性、方法和构造器。当你在子类中重写了父类的方法,但仍想调用父类中的原始实现时,super就显得非常有用。下面详细介绍如何使用super来调用父类的方法。
1. 调用父类的普通方法
当子类重写了一个方法后,如果仍需要执行父类中该方法的逻辑,可以使用 super.methodName() 来调用。
示例:
class Animal {
void makeSound() {
System.out.println("Animal makes a sound");
}
}
class Dog extends Animal {
@Override
void makeSound() {
super.makeSound(); // 调用父类方法
System.out.println("Dog barks");
}
}
输出结果:
立即学习“Java免费学习笔记(深入)”;
Animal makes a sound Dog barks
这里,super.makeSound() 明确调用了父类 Animal 的方法,再追加子类自己的行为。
2. 在构造器中调用父类构造器
子类构造器可以通过 super() 调用父类的构造器,必须放在构造器的第一行。
示例:
class Person {
String name;
Person(String name) {
this.name = name;
System.out.println("Person constructed: " + name);
}
}
class Student extends Person {
int studentId;
Student(String name, int id) {
super(name); // 调用父类构造器
this.studentId = id;
System.out.println("Student ID: " + id);
}
}
创建 Student 对象时,会先初始化父类的 name 属性,再初始化子类的 studentId。
3. 访问被隐藏的父类属性
如果子类定义了与父类同名的字段,可以使用 super.fieldName 访问父类的字段。
示例:
class Parent {
String info = "Parent info";
}
class Child extends Parent {
String info = "Child info";
void printInfo() {
System.out.println(super.info); // 输出:Parent info
System.out.println(this.info); // 输出:Child info
}
}
4. 注意事项
- super只能在子类中使用,不能在静态上下文中使用(如 static 方法)。
- 调用父类构造器的 super() 必须是子类构造器中的第一条语句。
- 不能同时使用 this() 和 super() 在同一个构造器中,因为两者都必须放在第一行。
基本上就这些。合理使用 super 可以让继承关系更清晰,代码复用更高效。理解其在方法、构造器和属性访问中的作用,是掌握Java面向对象编程的关键一步。不复杂但容易忽略细节。










