Java中super关键字的学习

BingBing-8888 / 2024-08-29 / 原文

super关键字


目录
  • super关键字
      • 1. 访问父类的成员变量
      • 2. 调用父类的方法
      • 3. 调用父类的构造方法
      • 4. 在实现接口的类中调用接口的默认方法
      • 注意事项

在Java中,super是一个关键字,它主要用于在子类中引用父类的成员(包括字段、方法和构造方法),或者用于解决子类和父类之间的命名冲突。以下是super关键字的具体用法:

1. 访问父类的成员变量

当子类中存在与父类同名的成员变量时,可以使用super关键字来访问父类的成员变量。这有助于区分子类中的成员变量和从父类继承而来的成员变量。

class Parent {
    int value = 10;
}

class Child extends Parent {
    int value = 20;
    void display() {
        System.out.println("Child class value: " + this.value); // 访问子类自己的value
        System.out.println("Parent class value: " + super.value); // 访问父类的value
    }
}

2. 调用父类的方法

在子类中,可以使用super关键字来调用父类的方法。这通常用于在子类的方法实现中,需要调用父类相同名称的方法时。

class Parent {
    void display() {
        System.out.println("Parent class display()");
    }
}

class Child extends Parent {
    void display() {
        super.display(); // 调用父类的display方法
        System.out.println("Child class display()");
    }
}

3. 调用父类的构造方法

在子类的构造方法中,super关键字用于调用父类的构造方法。这通常用于初始化从父类继承而来的成员变量或执行父类的构造逻辑。需要注意的是,super()调用必须是子类构造方法中的第一条语句(如果父类没有无参构造方法,并且子类的构造方法中没有显式调用父类的其他构造方法,则会编译错误)。

class Parent {
    Parent(int value) {
        // 父类构造方法实现
    }
}

class Child extends Parent {
    Child(int value) {
        super(value); // 调用父类的构造方法
        // 子类构造方法的其他实现
    }
}

4. 在实现接口的类中调用接口的默认方法

当类实现了接口,并且该类中定义了与接口默认方法同名的方法时,可以使用接口名.super.方法名()的语法来调用接口的默认方法。

interface MyInterface {
    default void myMethod() {
        System.out.println("Default method in interface");
    }
}

class MyClass implements MyInterface {
    void myMethod() {
        System.out.println("Class method");
        MyInterface.super.myMethod(); // 调用接口的默认方法
    }
}

注意事项

  • super关键字只能在子类中使用。
  • 在子类的构造方法中,如果没有显式调用父类的构造方法,则会隐式调用父类的无参构造方法(如果父类存在无参构造方法的话)。如果父类没有无参构造方法且子类构造方法中没有显式调用父类的其他构造方法,则会导致编译错误。
  • super关键字不能用于访问或调用祖先类的成员,它只能用于访问直接父类的成员。

综上所述,super关键字在Java中是一个非常重要的概念,它使得子类能够方便地访问和调用父类的成员,以及解决子类和父类之间的命名冲突。