super关键字
简单来说,super关键字在Java中代表的就是父类(Superclass)可以看作是指向父类的专属遥控器
一般来说,super关键字有三类常见的使用场景:
- 调用父类被覆盖的方法
java
class Animal {
public void eat() {
System.out.println("动物在吃东西...");
}
}
class Dog extends Animal {
@Override
public void eat() {
// 先用 super 调用父类原来的方法
super.eat();
// 再加上子类特有的逻辑
System.out.println("狗在啃骨头!");
}
}
// 运行 Dog 的 eat() 会输出:
// 动物在吃东西...
// 狗在啃骨头!
- 调用父类的构造方法(最常用)
这是 super****最重要的作用。 在现实中,"先有父亲,后有儿子"。在程序里也是一样:在创建子类对象之前,必须先初始化它的 父类 部分。
怎么初始化?就是通过在子类的构造方法里,使用 super() 来调用父类的构造方法。
java
class Animal {
String name;
// 父类的构造器
public Animal(String name) {
this.name = name;
System.out.println("父类 Animal 被初始化了,名字叫: " + name);
}
}
class Dog extends Animal {
String breed; // 品种
// 子类的构造器
public Dog(String name, String breed) {
// 关键点:必须使用 super() 将 name 传给父类去初始化!
super(name);
this.breed = breed;
System.out.println("子类 Dog 被初始化了,品种是: " + breed);
}
}
注意:如果要在子类构造器里写 super(),它必须被放在子类构造器的第一行 !否则编译器会直接报错。如果你什么都不写,Java 会默认在第一行悄悄帮你加上一个无参数的 super();。
- 访问父类的同名属性:如果子类和父类定义了名字完全一样 的成员变量(这叫变量隐藏),在子类里想拿到父类的那个变量,就必须加
super.。
java
class Animal {
int age = 10; // 父类的 age
}
class Dog extends Animal {
int age = 2; // 子类的 age (名字一样)
public void printAge() {
System.out.println("狗的年龄: " + age); // 默认访问子类自己的(输出 2)
System.out.println("父类动物的年龄: " + super.age); // 使用 super 访问父类的(输出 10)
}
}