题目描述 实例化一个 Accont 类对象,包含账户号码和余额两个属性。主程序克隆一个账户,对克隆进行取款操作,验证原对象余额不变。 输入格式 输入分两行 第一行输入账户号码和余额 第二行为取款的数目 输出格式 输出原账号余额以及克隆账号余额 输入样例 在这里给出一组输入。例如: ACC999 1000 200 输出样例 在这里给出相应的输出。例如: 原账户余额:1000 克隆账户余额:800 原账户余额:1000 克隆账户余额:800
时间: 2025-06-24 12:41:56 浏览: 12
### 实现账户类的克隆以及独立操作
为了实现账户类 `Account` 的克隆功能,并确保对克隆对象的操作不会影响到原始对象的状态,可以采用 Java 中的对象深拷贝技术。以下是具体方法:
#### 1. 使用 `Cloneable` 接口和重写 `clone()` 方法
Java 提供了一个内置接口 `Cloneable` 和默认的方法 `Object.clone()` 来支持浅拷贝。如果需要深拷贝,则需手动处理复杂数据类型的成员变量。
下面是基于引用内容修改后的 `Account` 类定义及其克隆逻辑[^1]:
```java
public class Account implements Cloneable {
private String accountNumber; // 账号
private double balance; // 账户余额
/**
* 构造函数初始化账号和余额
*/
public Account(String accountNumber, double initialBalance) {
this.accountNumber = accountNumber;
this.balance = initialBalance;
}
/**
* 取款方法
* @param amount 需要取出的金额
*/
public synchronized void withdraw(double amount) throws IllegalArgumentException {
if (amount > balance || amount < 0) {
throw new IllegalArgumentException("取款失败:金额不足或非法!");
}
balance -= amount;
}
/**
* 获取当前余额
* @return 当前余额
*/
public double getBalance() {
return balance;
}
/**
* 获取账号编号
* @return 账号编号
*/
public String getAccountNumber() {
return accountNumber;
}
/**
* 克隆当前对象
* @return 新的克隆对象
*/
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
```
在实际应用中调用如下代码来完成克隆并执行取款操作:
```java
public class MainTest {
public static void main(String[] args) {
try {
// 创建初始账户对象
Account originalAccount = new Account("A12345", 1000);
System.out.println("Original Account Balance Before Withdrawal: " + originalAccount.getBalance());
// 克隆账户对象
Account clonedAccount = (Account) originalAccount.clone();
// 对克隆对象进行取款操作
clonedAccount.withdraw(200);
System.out.println("Cloned Account Balance After Withdrawal: " + clonedAccount.getBalance());
System.out.println("Original Account Balance After Cloning and Withdrawal on Copy: " + originalAccount.getBalance());
} catch (CloneNotSupportedException | IllegalArgumentException e) {
e.printStackTrace();
}
}
}
```
以上程序展示了如何安全地复制一个账户实例,并对其副本单独实施取款动作而保持源账户不变[^1]。
#### 2. 关于字符串对象创建的理解
需要注意的是,在某些情况下可能会涉及字符串对象的新建行为。例如当我们在构造器里传入新的字符串作为参数时会遵循特定规则。根据已有资料得知对于直接赋值给定字面量形式如 `"a"` 不会产生额外对象;而对于显式使用 `new` 则每次都会生成一个新的堆内存地址上的对象[^2]。不过本案例主要关注数值型字段而非字符序列管理故无需过多考虑这一点。
####
阅读全文