1. super 关键字简介
在 Java 面向对象编程中,super 是一个特殊的关键字,用于在子类中引用其直接父类(超类)的成员。它主要解决了子类与父类成员命名冲突时的访问问题,是实现继承和多态特性的重要工具。
2. super 的三种核心用法
2.1 访问父类的成员变量
当子类中定义了与父类同名的成员变量时,使用 super.变量名 可以明确访问父类中的变量,避免歧义。
java
class Parent {
String name = "Parent";
}
class Child extends Parent {
String name = "Child";
void printNames() {
System.out.println("子类 name: " + name); // 输出 Child
System.out.println("父类 name: " + super.name); // 输出 Parent
}
}
2.2 调用父类的成员方法
当子类重写了父类的方法,又需要在子类中调用父类被覆盖的方法时,可以使用 super.方法名()。
java
class Animal {
void makeSound() {
System.out.println("动物发出声音");
}
}
class Dog extends Animal {
@Override
void makeSound() {
super.makeSound(); // 先调用父类的通用行为
System.out.println("汪汪汪!"); // 再添加子类特有行为
}
}
2.3 调用父类的构造方法
在子类的构造方法中,可以使用 super(参数列表) 来调用父类的构造方法,且必须位于子类构造方法的第一行。
java
class Vehicle {
private int wheels;
public Vehicle(int wheels) {
this.wheels = wheels;
}
}
class Car extends Vehicle {
private String brand;
public Car(int wheels, String brand) {
super(wheels); // 调用父类构造方法,初始化 wheels
this.brand = brand; // 初始化子类特有属性
}
}
3. 使用 super 的注意事项与常见误区
- 构造方法调用必须第一行 :
super()或super(参数)必须写在子类构造方法的第一条语句。 - 不能用于静态上下文 :
super关键字与对象实例相关,不能在静态方法或静态代码块中使用。 - 不能链式调用祖父类 :
super.super.xxx的语法是非法的,super仅指向直接父类。 - 与 this 的区别 :
this指向当前对象实例,而super指向当前对象的父类部分。
4. 实战示例:super 在方法重写中的应用
以下示例展示了如何在重写方法时,利用 super 扩展父类功能而非完全替换。
java
class Logger {
void log(String message) {
System.out.println("[INFO] " + message);
}
}
class TimestampLogger extends Logger {
@Override
void log(String message) {
// 调用父类基础日志功能
super.log(message);
// 添加时间戳扩展功能
System.out.println("[TIMESTAMP] " + java.time.LocalDateTime.now());
}
}
5. 总结
super 关键字是 Java 继承体系中的"桥梁",它确保了子类在扩展父类功能时,仍能安全、清晰地访问父类的资源。掌握其三种用法(访问变量、调用方法、调用构造器)并理解其使用限制,是编写健壮、可维护的面向对象 Java 代码的基础。