1. 理解super关键字的核心价值
在Java面向对象编程中,super关键字就像家族传承中的"家谱索引",它明确指向当前对象的直接父类。这个看似简单的关键字,实际上解决了面向对象三大特性中"继承"环节的核心痛点——如何在子类中精准调用父类资源。
我见过太多初级开发者在这个问题上栽跟头:有的在方法重写后完全丢失父类实现,有的在构造方法中引发隐式调用问题,更常见的是在多级继承中迷失了方法调用的来源。super的出现,本质上是为了建立一条明确的"调用链",让子类既能扩展父类功能,又不会切断与父类的连接。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. super的三大应用场景解析
2.1 构造方法中的super()
在子类构造方法中,super()必须作为第一条语句(如果不写,编译器会自动添加)。这个设计背后有深刻的考量:
java复制public class Animal {
private String species;
public Animal(String species) {
this.species = species;
System.out.println("Animal构造完成");
}
}
public class Dog extends Animal {
public Dog() {
super("Canine"); // 必须显式调用
System.out.println("Dog构造完成");
}
}
关键经验:当父类没有无参构造时,子类必须显式调用super(参数),否则编译报错。这是新手最容易忽略的点。
2.2 方法重写时的super调用
方法重写时保留父类逻辑的经典模式:
java复制@Override
public void draw() {
super.draw(); // 先执行父类绘制逻辑
// 添加子类特有绘制逻辑
System.out.println("绘制子类特有元素");
}
实测案例:在Android开发中,自定义View时几乎都会用到这种模式,既保留了系统默认绘制,又添加了自定义效果。
2.3 访问被隐藏的父类字段
当子类字段与父类同名时:
