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
相关产品推荐
相关产品推荐

