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

为何此代码未正确重写抽象方法?编译报错未实现抽象方法

搞定抽象方法未实现的编译错误

嘿,我知道你现在看着编译报错提示“未实现抽象方法”有点懵——毕竟你明明在SBI类里写了getInterest方法啊!别着急,问题出在访问权限的细节上,咱们一步步拆解:

问题根源

Java里有个容易忽略的规则:子类重写父类方法时,访问权限不能比父类的方法更严格。

看你的代码:

abstract class Bank{ 
    int loan = 100; 
    // 这里的抽象方法没写修饰符,默认是「包访问权限」(default)
    int getInterest(int a); 
}
class SBI extends Bank{ 
    int loan = 200; 
    // 子类的实现方法也是默认包权限
    int getInterest(int a){ return a; } 
}

如果你的Bank和SBI不在同一个包下面,子类的这个方法就没法被外部访问到——编译器会认为你根本没正确实现父类的抽象方法,直接给你抛编译错误。就算在同一个包,这种写法也不够规范,很容易踩坑。

另外顺便提一句:你代码里b.loan输出100,new SBI().loan输出200,这是因为Java的成员变量只有「隐藏」没有「重写」,父类引用指向子类对象时,访问的是父类的变量,这点别搞混了~

修复方案

最靠谱的做法是给抽象方法显式加上public修饰符,子类实现时也用public,再加上@Override注解帮你校验:

abstract class Bank{ 
    int loan = 100; 
    // 显式声明public权限
    public abstract int getInterest(int a); 
}
class SBI extends Bank{ 
    int loan = 200; 
    // 子类方法用public,权限不小于父类,加上@Override确保重写正确
    @Override
    public int getInterest(int a){ 
        return a; 
    } 
}
class Test{ 
    public static void main(String[] s){ 
        Bank b = new SBI(); 
        System.out.println(b.getInterest(12)); 
        System.out.println(b.loan); 
        System.out.println(new SBI().loan); 
    } 
}

这样不管两个类在不在同一个包,都能顺利编译,@Override还能帮你提前发现方法签名写错的问题,比如参数类型不对、方法名拼错之类的。

额外要注意的点

  • 抽象方法必须被非抽象子类完全实现,方法签名(方法名、参数、返回值)必须完全匹配,访问权限只能更宽松不能更严格。
  • 别把成员变量的隐藏和方法重写搞混,父类引用访问的永远是父类的成员变量,子类引用才会访问自己的。

内容的提问来源于stack exchange,提问作者Rishi Prakash

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:48:10