为何抽象类B需实现add()方法?接口与抽象类多态疑问
问题解析
先看你的代码:
abstract class B extends A implements C { // 为什么必须在这里实现add()方法? } class A{ void add(){ } } interface C{ void add(); }
你疑惑的点在于:父类A已经实现了add(),为什么抽象类B实现接口C时还要处理这个方法?
核心原因是接口方法的访问权限规则:
- Java接口里的方法默认是
public abstract(即便没写修饰符),也就是说接口要求实现类必须提供一个public的add()方法。 - 而你的父类A中,
add()方法是包访问权限(默认无修饰符),这个权限比public窄。
当B继承A时,虽然能继承到add()方法,但这个方法的访问权限不满足接口C的要求——接口要求的是public级别的方法,而继承来的方法权限不够。所以编译器会强制你在B中显式处理这个方法,有两种方式:
- 方式一:提供public的实现,可选择调用父类的逻辑:
abstract class B extends A implements C { @Override public void add() { super.add(); // 复用父类A的实现 } }
- 方式二:把
add()声明为抽象方法,把实现责任交给B的具体子类:
abstract class B extends A implements C { @Override public abstract void add(); }
内容的提问来源于stack exchange,提问作者Ansh Gupta
相关产品推荐
相关产品推荐

