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

Java多态调用子类重写方法未生效 返回相同结果问题排查

问题根因

所有异常均来自static关键字的错误使用,和多态、继承机制无关。

  • 你将所有实例属性(price/weight/consumption_w,以及子类的hd/ram)声明为static静态变量:静态变量归属于类本身,全局仅存一份值,不属于任何单个对象实例。每新建一个对象修改这些值,都会覆盖之前所有对象对应的属性值,最终所有实例读取到的都是最后一次创建对象时写入的参数。这也解释了为什么单独创建单个对象测试结果正常,多个对象连续创建后所有返回值完全一致——最后创建的对象会把全局静态属性全部改成自己的参数,前面的对象读取属性时拿到的都是被覆盖后的值。
  • 你将父类的calc_consume_w()方法声明为static:静态方法不参与Java的多态动态绑定,子类无法重写静态方法,所有调用都会直接执行父类的静态实现。
  • 你在TotalPrice类中将统计总金额的变量、接收设备数组的变量也声明为static,后续如果多次创建TotalPrice实例统计不同设备组,会出现数值跨实例累加的污染问题。
修正方案(完全符合题目要求,不改动指定的类结构、入参逻辑、App类代码)

仅需删除错误添加的static修饰符即可:

  1. 修改Device类
    • 删除price/weight/consumption_w属性前的static修饰符,basis_*开头的基准值常量保留static即可(基准值是类级别的固定默认值,使用静态变量合理)
    • 删除calc_consume_w()方法前的static修饰符
  2. 修改Laptop类
    • 删除hd属性前的static修饰符,basis_hd基准值保留static即可
    • 建议在重写的calc_price()方法上添加@Override注解,编辑器即可正确识别这是重写方法,给出对应代码提示,也能避免写错方法签名导致重写失效
  3. 修改Tablet类
    • 删除ram属性前的static修饰符,basis_ram基准值保留static即可
    • 同样给calc_price()方法添加@Override注解
  4. 修改TotalPrice类
    • 删除total_devices/total_laptops/total_tablets/devices属性前的static修饰符,这些属性归属于单个TotalPrice实例,不需要全局共享。
修正后效果

修改完成后重新运行App类,即可得到预期输出:

Total price of Devices: 700.0
Total price of Laptops: 580.0
Total price of Tablets: 110.0

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 11:18:35