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

Java子类继承父类后无法访问父类成员变量getTh问题咨询

问题根因

你遇到的现象本质上不是子类无法继承父类变量,而是两类错误导致的:

  • 父类成员变量默认是包私有(default)访问权限,如果两个类不在同一个包下,子类确实无法直接访问父类的包私有变量。
  • 你在父类function3的display方法中创建了全新独立的function4实例,你给当前function3实例的getTh等属性赋值的操作,不会同步到这个新创建的子类实例上,新实例继承的getTh默认值为0,看起来就像没拿到值。
解决方案

方案1:调整访问权限+优化实例调用逻辑

  1. 将父类需要子类访问的成员变量修饰符改为protected,保证跨包子类也能直接访问属性:
class function3 {
    // 修改为protected修饰,允许子类访问
    protected double getTh;
    protected double getTt;
    protected double getOt;
    
    public void display(String name, String id, double getTh, double getTt, double getOt) {
        this.getTh = getTh;
        this.getTt = getTt;
        this.getOt = getOt;
        
        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   : " + getTh);
        System.out.println("Employee Tardiness: " + getTt);
        System.out.println("-----------------------");
    }
}
  1. 调整实例调用逻辑,直接用子类实例调用父类方法完成属性赋值后再调用子类业务方法:
class function4 extends function3 {
    double overtimePay;
    double weeklyIncome;
    
    // 直接使用继承的getOt属性计算,不需要额外传参
    public void calcSalary() {
        overtimePay = getOt * 75.25;
        weeklyIncome = getTh * 200.50;
        System.out.println(weeklyIncome);
    }

    public void displaySalary() {
        System.out.println("WEEEKLY SALARY");
        System.out.println("-----------------------");
        System.out.println("Overtime Pay : " + overtimePay);
        System.out.println("Weekly Income: " + weeklyIncome);
        System.out.println("Gross Income : " + (overtimePay + weeklyIncome));
    }
}

// 调用示例
public class RunTest {
    public static void main(String[] args) {
        // 直接创建子类实例
        function4 salaryCalc = new function4();
        // 调用父类继承的display方法完成属性赋值
        salaryCalc.display("E001", "张三", 40, 1, 4);
        // 调用子类方法计算、展示薪资,此时getTh等属性已赋值
        salaryCalc.calcSalary();
        salaryCalc.displaySalary();
    }
}

方案2:通过父类Getter方法访问属性(无需修改变量修饰符)

如果不想修改父类变量的访问权限,可以在父类添加对应属性的公共Getter方法,子类通过方法获取值:

// 父类添加Getter方法
public double getGetTh() {
    return getTh;
}

public double getGetOt() {
    return getOt;
}

// 子类中调用Getter取值即可
weeklyIncome = getGetTh() * 200.50;
overtimePay = getGetOt() * 75.25;

补充提示:Java编码规范要求类名采用大驼峰命名,建议将function3、function4改为Function3、Function4,避免后续引发不必要的编译或识别问题。

内容的提问来源于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 12:06:03