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

Java使用extends继承后super取父类变量值为0如何解决?

根本原因

你代码中创建了两个完全独立的对象实例,数据互不连通:

  • 第一个是mainFunction类的实例callMeth,你调用该实例的timeIn()方法时,修改的是当前实例专属的成员变量totalHours、totalTardiness
  • 第二个是function2类的实例callMeth2,它是全新的独立对象,继承自父类的成员变量默认初始值为0,你从未对该实例的成员变量做过赋值操作,因此输出结果为0
    super关键字本身的语法使用没有问题,问题出在实例的使用逻辑错误。

继承实现的合理性说明

当前用extends继承的设计不符合面向对象规范:
继承需要满足*is-a(是一种)*的关系,例如“轿车是一种交通工具”才适合使用继承。你代码中的function2仅负责薪资信息打印,和负责考勤统计的mainFunction不存在从属关系,属于对继承特性的误用。

修复方案

方案1:现有继承结构下的快速修复

无需单独实例化父类,直接使用子类实例调用继承自父类的考勤方法,保证所有操作都在同一个实例上完成:

// 删除原有父类实例化代码
// mainFunction callMeth = new mainFunction();
// callMeth.timeIn();

// 直接通过子类实例调用父类方法
function2 callMeth2 = new function2();
callMeth2.timeIn();
callMeth2.display(getName, getId);

方案2:面向对象规范重构(推荐)

将继承改为依赖传参,拆分两个类的职责,后续扩展性更强:

  1. 调整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("-----------------------");
    }
}
  1. 调整主方法调用逻辑
mainFunction callMeth = new mainFunction();
callMeth.timeIn();

function2 callMeth2 = new function2();
// 将已统计完成的考勤实例传入展示方法
callMeth2.display(getName, getId, callMeth);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 13:45:03