2009年最后一博:关于 Java 中对象的复制
2009年最后一博:关于 Java 中对象的复制
Java 中的赋值操作符与 C++ 中的不一样。在 C++ 中,这条语句:bc2 = bc1;将一个名为 bc1 的对象的所有数据都拷贝到名为 bc2 的对象中。也就是说这条语句执行后,程序中有两个含有相同数据的对象。然而在 Java 中,这条相同的赋值语句只向 bc2 中拷贝了 bc1 指向的存储地址,现在 bc1 和 bc2 实际上指的是同一个对象,它们都是这个对象的引用。这样大大提高了内存使用效率,同时也容易让一些对内存了解不深的朋友带来一些使用上的错误。比如 bc1.add(25);buc2.add(20);执行之后 bc1 增加了 45。而作者本意可能是只是让 bc1 增加 25,bc2 增加 20 而已。这说明了,在 Java 中,bc2 = bc1; 并不是真正意义上的复制。那么在 Java 中如何进行对象复制呢?作者结合 Java 数据结构相关知识,总结了一些项目中的经验,希望可以和大家共同探讨一下这个问题。
没有使用对象复制的代码:
银行帐户源代码 BankAccount.java:
package clone;
public class BankAccount{
private double balance;
public BankAccount(double ini){
this.balance = ini;
}
public double getBalance() {
return balance;
}
public void setBalance(double balance) {
this.balance = balance;
}
public void add(double give){
this.balance += give;
}
public void redu(double give){
this.balance -= give;
}
}
程序入口 TestClone.java:
package clone;
public class TestClone {
public static void main(String[] args) {
BankAccount bc1 = new BankAccount(1000.0);
BankAccount bc2 = bc1;
bc1.add(25);
bc2.add(20);
System.out.println("用户 1 的帐户余额为:" + bc1.getBalance());
System.out.println("用户 2 的帐户余额为:" + bc2.getBalance());
}
}
执行 TestClone.java,打印结果如下:
用户 1 的帐户余额为:1045.0
用户 2 的帐户余额为:1045.0
这下用户 2 要哭了:自己辛辛苦苦攒的一点钱都存别人帐户里边去了。怎么解决这个
相关文档:
一:准备 www.savarese.org download
1. rocksaw-1.0.0-src.tar.gz
2. vserv-tcpip-0.9.2-src.tar.gz
二:编译源文件得到jar包 使用Ant
1. build vserv-tcpip-0.9.2-src
在vserv-tcpip-0.9.2目录下面建一个tests目录,然后在cmd窗口下进入 ......
(1).public static String StrReplace(String rStr, String rFix, String rRep)
{
int l = 0;
String gRt ......
学习java已达一周。
促使我打算学习java的原因是今年的一个项目。今年用C++做了一个很简单的分布式non-relational key-value store. 功能仿照Dynamo,但是实现要比它简单得多,很多比如容错等模块都没有加上去。但即便如此,用C++来开发这么一个东西仍然不是一件让人愉快的事。举个例子,为了用event driven架构,一开始打 ......
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class ......