在Java的继承体系中,super关键字是连接父子类的关键桥梁。它解决了子类与父类成员冲突的难题,更是构造方法调用的核心机制。本文将深入剖析super的三大核心用法,助你彻底掌握继承的精髓!
1. super的三大核心用途
1.1 调用父类构造方法
子类必须在构造方法中首行调用父类构造方法(显式或隐式)
class Animal {
String type;
Animal(String type) { // 父类构造方法
this.type = type;
}
}
class Dog extends Animal {
String breed;
Dog(String type, String breed) {
super(type); // 关键!必须放在第一行
this.breed = breed;
}
}
- 若父类没有无参构造,子类必须显式调用super(参数)
- 省略super()时,编译器自动添加无参super调用
1.2 访问父类成员变量
当子类与父类存在同名变量时,用super精准调用父类字段
class Bird {
String color = "Blue";
}
class Parrot extends Bird {
String color = "Green";
void printColors() {
System.out.println(super.color); // 输出:Blue(父类变量)
System.out.println(this.color); // 输出:Green(子类变量)
}
}
1.3 调用父类被重写的方法
子类重写方法后,仍可通过super调用父类原始逻辑
class Phone {
void call() {
System.out.println("拨号中...");
}
}
class SmartPhone extends Phone {
@Override
void call() {
super.call(); // 先执行父类通话逻辑
System.out.println("启动视频通话!");
}
}
2. 三大易错点解析(面试高频!)
2.1 构造方法调用铁律
class Car {
Car(int speed) { } // 无默认无参构造
}
class ElectricCar extends Car {
ElectricCar() {
// 编译错误!父类缺少无参构造
super(100); // 正确方案:显式调用父类有参构造
}
}
2.2 静态上下文中禁止使用super
class Parent {
String name = "Parent";
}
class Child extends Parent {
static void print() {
// System.out.println(super.name); // 错误!静态方法不能访问super
}
}
2.3 链式调用规范
class A {
A() { System.out.println("A构造"); }
}
class B extends A {
B() {
// 此处隐含 super();
System.out.println("B构造");
}
}
// 执行 new B() 输出:
// A构造
// B构造
3. supervs this核心区别
特性 | super | this |
指向对象 | 父类实例 | 当前类实例 |
构造方法调用 | super()/super(参数) | this()/this(参数) |
变量访问 | 直接访问父类成员 | 优先访问当前类成员 |
静态上下文 | 禁止使用 | 允许(指向当前类) |
关键记忆点:
this是横向查找(本类优先)
super是纵向查找(穿透子类找父类)
4. 实战应用:构建继承体系
class Employee {
private String id;
Employee(String id) {
this.id = id;
}
void work() {
System.out.println(id + "处理常规任务");
}
}
class Manager extends Employee {
private int level;
Manager(String id, int level) {
super(id); // 调用父类构造
this.level = level;
}
@Override
void work() {
super.work(); // 复用父类方法
System.out.println("级别" + level + "经理统筹项目");
}
}
// 测试
public class Company {
public static void main(String[] args) {
Manager mgr = new Manager("M001", 3);
mgr.work();
/* 输出:
M001处理常规任务
级别3经理统筹项目
*/
}
}
5. 高频面试题解析
Q1:子类不写构造方法会怎样?
编译器自动生成无参构造,并添加super()
若父类无无参构造,则编译报错!
Q2:能否同时用this()和super()?
构造方法中this()和super()不能共存
因为二者都必须放在首行
Q3:为什么需要super调用父类方法?
避免代码冗余:复用父类已实现的逻辑
增强扩展性:在父类逻辑基础上追加新功能(如模板方法模式)
黄金法则: 继承是"is-a"关系,而super就是维持父子契约的钥匙! 掌握它,你才能真正驾驭Java面向对象的核心设计思想。
动手实践:尝试编写三层继承结构(爷爷类→爸爸类→儿子类),体验super的跨级调用魅力!遇到问题?评论区见!