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

Java中子类SavingAccount如何调用父类Account的私有变量bal?

在Java中子类调用父类私有变量的方法

嘿,这个问题很常见——Java的封装机制本来就限制了子类直接访问父类的私有成员,但我们有几种合法且符合(或在特殊场景下可用)的方式来处理这个需求,下面给你逐一说明:

1. 父类提供公共Getter方法(最推荐,符合封装原则)

这是面向对象编程中最标准的做法,通过父类暴露的公共方法来获取私有变量,既保留了封装性,又能让子类合法访问。

首先修改父类Account,添加获取bal的方法:

public class Account { 
    private double bal;

    // 添加构造器初始化bal
    public Account(double bal) {
        this.bal = bal;
    }

    // 公共的getter方法,暴露bal的访问入口
    public double getBal() {
        return bal;
    }
}

然后在子类SavingAccount中,就可以通过调用这个getter方法来获取bal了:

public class SavingAccount extends Account { 
    private int interesi; 
    public SavingAccount(double a, int interesi){ 
        super(a); // 这里参数类型要和父类构造器匹配,原代码的int建议改成double
        this.interesi = interesi;
    }

    // 示例:在子类方法中使用父类的bal
    public void printCurrentBalance() {
        double balance = getBal(); // 直接调用继承来的getter方法
        System.out.println("当前账户余额:" + balance);
    }
}

2. 修正子类构造器的调用问题

你当前的子类代码里调用了super(a),但原父类Account没有对应的构造器,会直接编译报错。所以必须给父类添加接受double类型参数的构造器(如上面代码所示),这样子类才能通过构造器正确初始化父类的bal,之后再通过getter方法获取它的值。

3. 使用反射(不推荐,仅特殊场景使用)

如果你无法修改父类的代码,又必须访问私有变量,可以用Java反射机制,但这会破坏封装性,不建议在常规业务代码中使用。示例代码如下:

public class SavingAccount extends Account { 
    private int interesi; 
    public SavingAccount(double a, int interesi){ 
        super(a); 
        this.interesi = interesi;
    }

    public double getParentBal() throws NoSuchFieldException, IllegalAccessException {
        // 获取父类的bal字段
        Field balField = Account.class.getDeclaredField("bal");
        // 绕过访问权限检查,设置为可访问
        balField.setAccessible(true);
        // 获取当前对象的bal值
        return (double) balField.get(this);
    }
}

额外提醒

  • 优先使用Getter方法,这是符合面向对象封装思想的最佳实践,能保证代码的可维护性和安全性。
  • 反射方法尽量避免,因为它会绕过Java的访问控制,可能导致代码不稳定,且后续调试难度大。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:42:17