提问者:小点点

如何从父类调用超类的方法。如何从接口调用相同的方法?


我正在学习java,我正在尝试重新创建一个场景,其中一个类正在扩展一个抽象类并实现一个接口。每个抽象类和接口都定义了一个相同的方法。现在从正在扩展和实现的类中,我想调用父级的实现。我试图像下面那样重新创建这个场景,但它给了我一个错误:不是一个封闭的类: A

interface C {
  default void m1(){
      System.out.println("C");
  }
}

abstract class A{
  abstract void display();
  void m1(){
      System.out.println("A");
  }
}

class B extends A implements C{
    public void m1(){
    }
    void display() {
        C.super.m1();
        A.super.m1(); // error: not an enclosing class: A
    }
}

public class Main {
  public static void main(String[] args) {
    A obj = new B();
    obj.display();
  }
}

共1个答案

匿名用户

你不需要显式地命名一个超类来调用它的方法,因为一个Java类只能有一个超类,所以MyClass. super.method()是明确的。事实上,你甚至不需要给子类命名:super.method()也是明确的,因为Java的单一继承模型。

你确实需要显式地命名一个超级接口来调用它的方法,因为一个Java类可以实现多个接口,所以MyInterface. super.method()是识别正在调用的接口所必需的。

interface MyInterface {
    default void m1(){
        System.out.println("MyInterface");
    }
}

abstract class MyAbstractClass {
    public void m1(){
        System.out.println("MyAbstractClass");
    }
}

public class MyClass extends MyAbstractClass implements MyInterface {
    @Override
    public void m1() {
        super.m1();             // MyAbstractClass
        MyClass.super.m1();     // MyAbstractClass
        MyInterface.super.m1(); // MyInterface
    }

    public static void main(String... args) {
        new MyClass().m1();
    }
}