我正在学习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();
}
}
你不需要显式地命名一个超类来调用它的方法,因为一个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();
}
}