Java子类继承父类后无法访问父类成员变量getTh问题咨询
问题根因
你遇到的现象本质上不是子类无法继承父类变量,而是两类错误导致的:
- 父类成员变量默认是包私有(default)访问权限,如果两个类不在同一个包下,子类确实无法直接访问父类的包私有变量。
- 你在父类
function3的display方法中创建了全新独立的function4实例,你给当前function3实例的getTh等属性赋值的操作,不会同步到这个新创建的子类实例上,新实例继承的getTh默认值为0,看起来就像没拿到值。
解决方案
方案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("-----------------------"); } }
- 调整实例调用逻辑,直接用子类实例调用父类方法完成属性赋值后再调用子类业务方法:
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
相关产品推荐
相关产品推荐

