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

Java ATM系统技术问题:类信息访问限制与getchangebalance方法取值异常

嘿,咱们来逐个解决你碰到的这两个问题,先从代码里的方法问题说起,再聊数据访问限制的设计思路!

问题2:getchangebalance无法读取setchangebalance设置的值

先看你贴的CheckBalance.java代码:

package atm;
import java.util.Scanner;
public class CheckBalance extends Validation {
    Scanner sc = new Scanner(System.in);
    public CheckBalance(int i) {
        Validation vd = new Validation();
        System.out.println("RM" + vd.getchangebalance());
        System.out.println("1...");
    }
}

问题出在实例对象不统一:你调用setchangebalance时,操作的是某个Validation实例的accountbalance变量,但在CheckBalance的构造函数里,又新建了一个完全独立的Validation vd对象——每个类的实例都有自己的成员变量副本,所以这个新实例的accountbalance根本没被设置过,自然拿不到值。

解决方法很简单,因为CheckBalance已经继承了Validation,直接用当前实例的方法就行,不用再新建对象:

public CheckBalance(int i) {
    // 直接用this调用父类的get方法,当前实例继承了Validation的成员
    System.out.println("RM" + this.getchangebalance());
    System.out.println("1...");
}

另外要确认Validation类里的accountbalance是实例变量(非static),且setchangebalance确实给当前实例的字段赋值,比如Validation类的核心代码应该类似:

public class Validation {
    private int accountbalance; // 私有字段,封装数据

    public void setchangebalance(int balance) {
        this.accountbalance = balance; // 给当前实例的字段赋值
    }

    public int getchangebalance() {
        return this.accountbalance; // 返回当前实例的字段值
    }
}
问题1:限制用户自行从已整理信息的类中获取数据

这是典型的安全封装设计需求,核心就是不让外部代码直接触碰数据类的内部字段,甚至限制直接实例化数据类,只通过受控的方式提供数据访问:

  • 第一步:私有化核心数据字段:把Validation里的accountbalance设为private,只通过你提供的方法(或更受限的方法)操作,避免外部直接读写。
  • 第二步:限制数据类的实例化权限:如果不想让其他包的类直接创建Validation实例,可以把它的构造函数设为包私有(去掉public修饰符),或者用工厂模式控制实例创建:
// Validation类
public class Validation {
    private int accountbalance;
    // 私有构造函数,外部不能直接new
    private Validation() {}

    // 静态工厂方法,统一控制实例创建
    public static Validation createInstance() {
        return new Validation();
    }

    // 只提供必要的查询方法,若不需要外部修改余额,可去掉set方法
    public int getchangebalance() {
        return accountbalance;
    }

    // 仅内部/受控类可调用的修改方法
    void internalSetBalance(int balance) {
        this.accountbalance = balance;
    }
}
  • 第三步:用服务类封装所有数据操作:把余额查询、修改等逻辑都放到专门的BankService类里,外部代码只能调用服务类的方法,完全接触不到底层的Validation数据类,彻底隔离数据访问:
public class BankService {
    private Validation validation = Validation.createInstance();

    public int queryBalance() {
        // 可在此添加权限校验、日志记录等安全逻辑
        return validation.getchangebalance();
    }

    public void updateBalance(int newBalance) {
        // 加业务校验:比如余额不能为负
        if (newBalance >= 0) {
            validation.internalSetBalance(newBalance);
        } else {
            throw new IllegalArgumentException("余额不能为负数");
        }
    }
}

这样外部代码只能通过BankService操作余额,完全无法直接从Validation类获取数据,符合银行系统的安全需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:12:08