Java使用extends继承后super取父类变量值为0如何解决?
根本原因
你代码中创建了两个完全独立的对象实例,数据互不连通:
- 第一个是
mainFunction类的实例callMeth,你调用该实例的timeIn()方法时,修改的是当前实例专属的成员变量totalHours、totalTardiness - 第二个是
function2类的实例callMeth2,它是全新的独立对象,继承自父类的成员变量默认初始值为0,你从未对该实例的成员变量做过赋值操作,因此输出结果为0super关键字本身的语法使用没有问题,问题出在实例的使用逻辑错误。
继承实现的合理性说明
当前用extends继承的设计不符合面向对象规范:
继承需要满足*is-a(是一种)*的关系,例如“轿车是一种交通工具”才适合使用继承。你代码中的function2仅负责薪资信息打印,和负责考勤统计的mainFunction不存在从属关系,属于对继承特性的误用。
修复方案
方案1:现有继承结构下的快速修复
无需单独实例化父类,直接使用子类实例调用继承自父类的考勤方法,保证所有操作都在同一个实例上完成:
// 删除原有父类实例化代码 // mainFunction callMeth = new mainFunction(); // callMeth.timeIn(); // 直接通过子类实例调用父类方法 function2 callMeth2 = new function2(); callMeth2.timeIn(); callMeth2.display(getName, getId);
方案2:面向对象规范重构(推荐)
将继承改为依赖传参,拆分两个类的职责,后续扩展性更强:
- 调整
function2的代码,移除继承,新增考勤参数接收
class function2 { // 入参加上已完成统计的考勤实例 void display(String name, String id, mainFunction attendance) { System.out.println("SALARY INFORMATION"); System.out.println("-----------------------"); System.out.println("Employee Id : " + name); System.out.println("Employee Name : " + id); System.out.println("Number of hours : " + attendance.totalHours); System.out.println("Employee Tardiness: " + attendance.totalTardiness); System.out.println("-----------------------"); } }
- 调整主方法调用逻辑
mainFunction callMeth = new mainFunction(); callMeth.timeIn(); function2 callMeth2 = new function2(); // 将已统计完成的考勤实例传入展示方法 callMeth2.display(getName, getId, callMeth);
内容的提问来源于stack exchange,提问作者helloWorld
相关产品推荐
相关产品推荐

