Java super 关键字详解
super 代表父类(超类)对象引用,专门用于子类访问父类的成员,解决子类与父类同名成员的冲突。
一、super 三大用法
1. super.成员变量:访问父类同名属性
子类、父类有相同变量名时,直接写变量名默认访问子类,super.变量 访问父类。
java
class Parent {
String name = "父类";
}
class Son extends Parent {
String name = "子类";
public void show() {
System.out.println(name); // 子类
System.out.println(super.name); // 父类
}
}
2. super.方法():调用父类同名方法
子类重写父类方法后,想复用父类原有逻辑,用 super.方法()。
java
class Parent {
public void say() {
System.out.println("父类说话");
}
}
class Son extends Parent {
@Override
public void say() {
super.say(); // 先执行父类方法
System.out.println("子类说话");
}
}
3. super():调用父类构造方法
super()必须写在子类构造方法第一行;- 不写
super()编译器会自动隐式添加无参super(); - 父类只有有参构造时,子类必须手动写
super(参数)匹配; super()和this()不能同时存在(都要求第一行)。
java
class Parent {
String name;
// 有参构造
public Parent(String name) {
this.name = name;
}
}
class Son extends Parent {
// 子类构造必须调用父类有参构造
public Son(String n) {
super(n); // 第一行,调用父类构造
}
}
二、super 与 this 对比
| 关键字 | 指代对象 | 使用场景 |
|---|---|---|
this |
当前子类对象 | 访问本类属性/方法、调用本类构造 this() |
super |
父类对象 | 访问父类属性/方法、调用父类构造 super() |
三、关键注意事项
-
静态方法不能使用 super
static 属于类,不依赖对象,而 super 依赖实例对象,编译报错。javapublic static void test() { super.say(); // 错误 } -
构造方法中
super()只能出现一次,且必须第一行; -
多层继承中,
super只能直接访问直接父类,不能跨代访问祖父类; -
子类构造执行顺序:先执行父类构造(super)→ 再执行子类构造。
四、完整综合示例
java
class Animal {
String type = "动物";
public Animal(String t) {
this.type = t;
}
public void run() {
System.out.println(type + "会跑");
}
}
class Dog extends Animal {
String type = "小狗";
public Dog() {
super("犬科"); // 调用父类有参构造
}
@Override
public void run() {
super.run(); // 调用父类run
System.out.println(super.type + ":" + this.type + "四条腿跑");
}
}
public class Test {
public static void main(String[] args) {
Dog dog = new Dog();
dog.run();
}
}
输出:
犬科会跑
犬科:小狗四条腿跑