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