Java中继承抽象类并实现接口后,如何调用两者的同名方法?
问题分析与解决
在Java中,当类继承抽象类同时实现接口且两者存在同名方法时,调用规则有明确区分:
- 对于接口的默认方法,因一个类可实现多个接口,可能存在多个同名默认方法,需用
接口名.super.方法名()明确指定调用哪个接口的实现。 - 对于继承的父类(包括抽象类),由于Java是单继承机制,不存在调用歧义,直接使用
super.方法名()即可调用父类方法,不需要加父类的类名前缀。
你代码里的A.super.m1()是错误语法,Java不支持通过父类名.super这种方式调用父类方法,这就是报错"not an enclosing class: 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(); // 调用接口C的默认方法 super.m1(); // 调用父类A的m1方法 } } public class Main { public static void main(String[] args) { A obj = new B(); obj.display(); } }
运行后会依次输出:
C A
内容的提问来源于stack exchange,提问作者Tejas Nakhate
相关产品推荐
相关产品推荐

