搞什么啊,前几篇去哪里啦。我的虚拟机呢。
Fuck…
package testEpcc;
import org.junit.experimental.theories.internal.Assignments;
import junit.framework.Assert;
/**
* 以下为浅拷贝,改变copy的值会改变原型的值(引用类型)
* 在考虑clone时,基本数据类型和不可变类可放在一起考虑
* */
public class TestClone {
public static void main(String[] args) throws CloneNotSupportedException {
User user=new User();
user.setUsername("zqy");
user.setAge(22);
Account account=new Account();
//引用指向堆上同一块位置
account.user=user;
account.account=2000;
Account copy=null;
try {
//拷贝account对象
copy=(Account)account.clone();
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//account是基本数据类型,所以copy和原型是独立且相等的
Assert.assertEquals(copy.account,account.account);
Assert.assertTrue(copy.account==account.account);
//user是引用类型,所以copy和原型的引用是同一的
Assert.assertTrue(copy.user==account.user);
//改变的是同一个东西
copy.user.setUsername("zhuangqy");
Assert.assertTrue(copy.user==account.user);
Assert.assertTrue(copy.user==user);
System.out.println(user.getUsername());//zhuangqyS
//拷贝User
User user1=(User) user.clone();
//String虽然是引用类型,但它为不可变类,没有办法通过copy.setUsername对它重新赋值。
user1.setUsername("zqy~");
//Assert.assertEquals(user1.getUsername(), user.getUsername());
System.out.println(user1.getUsername().equals(user.getUsername()));//false
//基本数据类型,所以拷贝后再赋值不改变原来的值
user1.setAge(23);
System.out.println(user1.getAge()==user.getAge());//false
}
}