Java多态调用子类重写方法未生效 返回相同结果问题排查
问题根因
所有异常均来自static关键字的错误使用,和多态、继承机制无关。
- 你将所有实例属性(
price/weight/consumption_w,以及子类的hd/ram)声明为static静态变量:静态变量归属于类本身,全局仅存一份值,不属于任何单个对象实例。每新建一个对象修改这些值,都会覆盖之前所有对象对应的属性值,最终所有实例读取到的都是最后一次创建对象时写入的参数。这也解释了为什么单独创建单个对象测试结果正常,多个对象连续创建后所有返回值完全一致——最后创建的对象会把全局静态属性全部改成自己的参数,前面的对象读取属性时拿到的都是被覆盖后的值。 - 你将父类的
calc_consume_w()方法声明为static:静态方法不参与Java的多态动态绑定,子类无法重写静态方法,所有调用都会直接执行父类的静态实现。 - 你在
TotalPrice类中将统计总金额的变量、接收设备数组的变量也声明为static,后续如果多次创建TotalPrice实例统计不同设备组,会出现数值跨实例累加的污染问题。
修正方案(完全符合题目要求,不改动指定的类结构、入参逻辑、App类代码)
仅需删除错误添加的static修饰符即可:
- 修改
Device类- 删除
price/weight/consumption_w属性前的static修饰符,basis_*开头的基准值常量保留static即可(基准值是类级别的固定默认值,使用静态变量合理) - 删除
calc_consume_w()方法前的static修饰符
- 删除
- 修改
Laptop类- 删除
hd属性前的static修饰符,basis_hd基准值保留static即可 - 建议在重写的
calc_price()方法上添加@Override注解,编辑器即可正确识别这是重写方法,给出对应代码提示,也能避免写错方法签名导致重写失效
- 删除
- 修改
Tablet类- 删除
ram属性前的static修饰符,basis_ram基准值保留static即可 - 同样给
calc_price()方法添加@Override注解
- 删除
- 修改
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
相关产品推荐
相关产品推荐

