17370845950

如何在Java中理解super关键字
super用于明确调用父类成员。1. 子类构造方法中通过super()调用父类构造方法,必须位于首行;2. 用super.method()访问被重写的父类方法,可复用并增强父类功能;3. 用super.field访问被隐藏的父类字段,解决同名属性冲突。super确保在继承体系中精准调用父类成员,提升代码可控性与清晰度。

在Java中,super关键字是一个非常重要的概念,主要用于处理继承关系中的类。它可以帮助子类访问父类的成员(包括构造方法、属性和方法),特别是在存在重写或隐藏的情况下,明确指定调用父类的实现。

1. super调用父类构造方法

子类在创建对象时,会默认调用父类的无参构造方法。但如果父类没有无参构造方法,就必须显式使用super()来调用父类的有参构造方法。

  • super()必须出现在子类构造方法的第一行。
  • 用于初始化从父类继承来的成员。

例如:


class Animal {
    String name;
    Animal(String name) {
        this.name = name;
    }
}

class Dog extends Animal {
    Dog(String name) {
        super(name); // 调用父类构造方法
    }
}

2. super访问父类被重写的方法

当子类重写了父类的方法,如果仍想调用父类原来的实现,可以使用super.methodName()

  • 避免重复编写已被父类实现的功能。
  • 常用于在子类方法中“增强”父类行为。

示例:


class Animal {
    void makeSound() {
        System.out.println("Animal makes a sound");
    }
}

class Dog extends Animal {
    @Override
    void makeSound() {
        super.makeSound(); // 先执行父类方法
        System.out.println("Dog barks");
    }
}

3. super访问父类的字段(属性)

如果子类定义了与父类同名的字段,父类的字段会被隐藏。此时可以用super.fieldName访问父类的字段。

  • 字段不参与多态,所以需要super显式访问。
  • 常见于属性名称冲突的情况。

例子:


class Animal {
    String name = "Animal";
}

class Dog extends Animal {
    String name = "Dog";
    
    void printNames() {
        System.out.println(super.name); // 输出 Animal
        System.out.println(this.name);  // 输出 Dog
    }
}

基本上就这些。super的核心作用是“明确指向父类”,帮助我们在继承体系中精确控制调用来源。理解super有助于写出更清晰、可控的继承代码,尤其是在复杂层级结构中。不复杂但容易忽略细节。