一句话总结它的作用:super 代表的是“父类”(或者叫超类、基类)空间,用来在子类中访问父类的成员(属性、方法、构造器)。
1. 使用场景一:用 super 调用父类的构造器(最常用)
当你在 new 一个子类对象时,子类的构造器必须先调用父类的构造器,确保从父类继承过来的属性能够被正确初始化。
🚨 核心规则:隐式调用
如果你在子类的构造器里没有手动写 super(),Java 编译器会在第一行自动帮你加上 super();(调用父类的无参构造器)。
class Father {
public Father() {
System.out.println("1. 父类无参构造器被调用");
}
}
class Son extends Father {
public Son() {
// 编译器在这里偷偷加了一行:super();
System.out.println("2. 子类构造器被调用");
}
}
当你 new Son() 时,控制台会先打印 1,再打印 2。
💡 显式调用:父类没有无参构造器怎么办?
如果父类只定义了带参数的构造器,编译器就不会自动加 super() 了。这时子类必须手动显式调用 super(参数),否则编译直接报错。
class Father {
String lastName;
// 父类只有带参构造器
public Father(String lastName) {
this.lastName = lastName;
}
}
class Son extends Father {
int age;
public Son(String lastName, int age) {
super(lastName); // 🚨 必须手动调用父类带参构造器,且必须写在第一行!
this.age = age;
}
}
2. 使用场景二:用 super 区分同名的属性(成员变量)
如果子类起了一个和父类一模一样的变量名,父类的变量就会被“隐藏”。此时如果你想在子类中访问父类的那个变量,就需要加上 super. 前缀。
class Father {
String name = "张三(老爸)";
}
class Son extends Father {
String name = "张小三(儿子)";
public void show() {
System.out.println(name); // 打印:张小三(儿子) —— 默认就近原则
System.out.println(this.name); // 打印:张小三(儿子) —— 显式指定当前子类
System.out.println(super.name); // 打印:张三(老爸) —— 🚨 通过 super 突破限制,访问父类
}
}
3. 使用场景三:用 super 调用父类被重写(Override)的方法
在面向对象开发中,子类经常会重写父类的方法。但有时候,子类并不想完全抛弃父类的方法,而是想在父类方法的基础上进行“功能增强”。
这时就可以用 super.方法名()。
class Robot {
public void work() {
System.out.println("开机,开始扫描环境...");
}
}
class CleaningRobot extends Robot {
@Override
public void work() {
super.work(); // 🚨 先让父类做它该做的事(开机和扫描)
System.out.println("开始拖地、擦桌子..."); // 子类特有的拓展功能
}
}
2万+



被折叠的 条评论
为什么被折叠?



