You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何抽象类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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 10:15:59