Java super 关键字详解

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():调用父类构造方法

  1. super() 必须写在子类构造方法第一行
  2. 不写 super() 编译器会自动隐式添加无参 super()
  3. 父类只有有参构造时,子类必须手动写 super(参数) 匹配;
  4. 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()

三、关键注意事项

  1. 静态方法不能使用 super
    static 属于类,不依赖对象,而 super 依赖实例对象,编译报错。

    java 复制代码
    public static void test() {
        super.say(); // 错误
    }
  2. 构造方法中 super() 只能出现一次,且必须第一行;

  3. 多层继承中,super 只能直接访问直接父类,不能跨代访问祖父类;

  4. 子类构造执行顺序:先执行父类构造(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();
    }
}

输出:

复制代码
犬科会跑
犬科:小狗四条腿跑