Java super关键字详解与案例
super关键字主要用于子类访问父类的成员(变量、方法、构造方法),以下是几个典型的使用案例:

调用父类构造方法
class Animal {
String name;
int age;
// 父类构造方法
public Animal(String name, int age) {
this.name = name;
this.age = age;
System.out.println("Animal构造方法被调用");
}
}
class Dog extends Animal {
String breed;
// 子类构造方法中使用super调用父类构造方法
public Dog(String name, int age, String breed) {
super(name, age); // 必须放在第一行
this.breed = breed;
System.out.println("Dog构造方法被调用");
}
}
public class Test {
public static void main(String[] args) {
Dog dog = new Dog("旺财", 3, "金毛");
}
}
输出:
Animal构造方法被调用
Dog构造方法被调用
访问父类成员变量
class Parent {
String message = "父类的消息";
}
class Child extends Parent {
String message = "子类的消息";
public void printMessage() {
System.out.println("子类的message: " + this.message);
System.out.println("父类的message: " + super.message); // 访问父类变量
}
}
public class Test {
public static void main(String[] args) {
Child child = new Child();
child.printMessage();
}
}
输出:
子类的message: 子类的消息
父类的message: 父类的消息
调用父类方法
class Vehicle {
public void run() {
System.out.println("车辆在行驶");
}
public void stop() {
System.out.println("车辆已停止");
}
}
class Car extends Vehicle {
@Override
public void run() {
super.run(); // 调用父类的run方法
System.out.println("汽车在高速行驶");
}
public void emergencyStop() {
System.out.println("紧急刹车!");
super.stop(); // 调用父类的stop方法
}
}
public class Test {
public static void main(String[] args) {
Car car = new Car();
car.run();
System.out.println("---");
car.emergencyStop();
}
}
输出:
车辆在行驶
汽车在高速行驶
---
紧急刹车!
车辆已停止
完整的实际案例
// 员工管理系统案例
class Employee {
protected String name;
protected double salary;
public Employee(String name, double salary) {
this.name = name;
this.salary = salary;
}
public void work() {
System.out.println(name + "正在工作");
}
public double calculateBonus() {
return salary * 0.1; // 默认奖金为工资的10%
}
}
class Manager extends Employee {
private int teamSize;
public Manager(String name, double salary, int teamSize) {
super(name, salary); // 调用父类构造方法
this.teamSize = teamSize;
}
@Override
public void work() {
super.work(); // 调用父类方法
System.out.println(name + "管理着" + teamSize + "人团队");
}
@Override
public double calculateBonus() {
// 使用父类方法计算基础奖金,然后增加管理奖金
double baseBonus = super.calculateBonus(); // 调用父类方法
double managerBonus = teamSize * 1000; // 每人1000元管理奖金
return baseBonus + managerBonus;
}
public void printInfo() {
System.out.println("姓名: " + super.name);
System.out.println("工资: " + super.salary);
System.out.println("管理团队人数: " + teamSize);
}
}
public class Test {
public static void main(String[] args) {
Manager manager = new Manager("张三", 15000, 5);
manager.work();
System.out.println("---");
manager.printInfo();
System.out.println("奖金: " + manager.calculateBonus());
}
}
输出:
张三正在工作
张三管理着5人团队
---
姓名: 张三
工资: 15000.0
管理团队人数: 5
奖金: 6500.0
使用super关键字的注意事项:
- 调用父类构造方法时必须放在子类构造方法的第一行
- 不能同时使用super()和this()调用构造方法
- 如果父类没有无参构造方法,子类必须显式调用父类的有参构造方法
- super不能用于静态方法中
- 当子类和父类有同名成员时,super用于区分
这些案例涵盖了super关键字的主要使用场景,理解这些对Java面向对象编程非常重要。