在Java语言中,因为有引用类型的变量,所以也会有浅拷贝与深拷贝的区别
对于Java中的基础类型byte boolean char short int long float double不需要区分深拷贝和浅拷贝
下面通过一个例子解释深拷贝和浅拷贝
有个Person类如下:
1 class Person implements Cloneable { 2 private String name; 3 private int age; 5 6 public Person(String name, int age{ 7 this.name = name; 8 this.age = age;10 } 9 10 @Override 11 public String toString() { 12 return "Person [name=" + name + ", age=" + age + "]"; 13 } 14 }
Person curry= new Person("curry", 27) ;
Person curry2 = curry.clone() ;
内存中的模型如下图
此时 curry和curry2出两个person对象的name属性值 都为curry, 且当curry2.setName("kobe") ;时,curry.getName() 也返回"kobe"
这就是浅拷贝
此时为深拷贝,再次调用curry2.setName("kobe") ; 不会发生之前的情况
介绍的深拷贝和浅拷贝的概念后,通过实际例子来实现深拷贝和浅拷贝
浅拷贝代码示例
package priv.jack.jdk.demo; /** * 浅拷贝 * @author Jack * */ public class ShallowCopy { public static void main(String[] args) throws Exception { Wallet wallet = new Wallet("LV", 10000); Person p1 = new Person("curry", 28, wallet); Person p2 = (Person) p1.clone(); p2.getWallet().setName("保罗"); p2.getWallet().setMoney(60); p2.setName("stu"); p2.setAge(30); System.out.println(p1.toString()); System.out.println(p2.toString()); } } class Wallet implements Cloneable { private String name; private long money; public Wallet(String name, int money) { this.name = name; this.money = money; } @Override public String toString() { return "Wallet [name=" + name + ", money=" + money + "]"; } public String getName() { return name; } public void setName(String name) { this.name = name; } public long getMoney() { return money; } public void setMoney(long money) { this.money = money; } @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } } class Person implements Cloneable { private String name; private int age; private Wallet wallet; public Person(String name, int age, Wallet wallet) { this.name = name; this.age = age; this.wallet = wallet; } @Override public String toString() { return "Person [name=" + name + ", age=" + age + ", p=" + wallet + "]"; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Wallet getWallet() { return wallet; } public void setWallet(Wallet wallet) { this.wallet = wallet; } @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } }
运行结果如下
Person [name=curry, age=28, p=Wallet [name=保罗, money=60]]
Person [name=stu, age=30, p=Wallet [name=保罗, money=60]]
钱包的名称和金额都变了,说明两个人公用一个钱包,这样不好吧
深拷贝实例一
package priv.jack.jdk.demo; /** * 深拷贝 * @author Jack * */ public class DeepCopy1 { public static void main(String[] args) throws Exception { Wallet1 Wallet1 = new Wallet1("LV", 10000); Person1 p1 = new Person1("curry", 28, Wallet1); Person1 p2 = (Person1) p1.clone(); p2.getWallet1().setName("保罗"); p2.getWallet1().setMoney(60); p2.setName("stu"); p2.setAge(30); System.out.println(p1.toString()); System.out.println(p2.toString()); } } class Wallet1 implements Cloneable { private String name; private long money; public Wallet1(String name, int money) { this.name = name; this.money = money; } @Override public String toString() { return "Wallet1 [name=" + name + ", money=" + money + "]"; } public String getName() { return name; } public void setName(String name) { this.name = name; } public long getMoney() { return money; } public void setMoney(long money) { this.money = money; } @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } } class Person1 implements Cloneable { private String name; private int age; private Wallet1 wallet; public Person1(String name, int age, Wallet1 Wallet1) { this.name = name; this.age = age; this.wallet = Wallet1; } @Override public String toString() { return "Person1 [name=" + name + ", age=" + age + ", p=" + wallet + "]"; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Wallet1 getWallet1() { return wallet; } public void setWallet1(Wallet1 wallet) { this.wallet = wallet; } @Override protected Object clone() throws CloneNotSupportedException { Person1 p =(Person1) super.clone() ; p.wallet = (Wallet1) wallet.clone() ; return p ; } }
运行结果如下:
Person1 [name=curry, age=28, p=Wallet1 [name=LV, money=10000]]
Person1 [name=stu, age=30, p=Wallet1 [name=保罗, money=60]]
深拷贝实例二
package priv.jack.jdk.demo; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; /** * 深拷贝 * @author Jack * */ public class DeepCopy2{ public static void main(String[] args) throws Exception { Wallet2 wallet = new Wallet2("LV", 10000); Person2 p1 = new Person2("curry", 28, wallet); Person2 p2 = (Person2) p1.deepClone(); p2.getWallet2().setName("保罗"); p2.getWallet2().setMoney(60); p2.setName("stu"); p2.setAge(30); System.out.println(p1.toString()); System.out.println(p2.toString()); } } class Wallet2 implements Serializable { private static final long serialVersionUID = 5496170174896341934L; private String name; private long money; public Wallet2(String name, int money) { this.name = name; this.money = money; } @Override public String toString() { return "Wallet2 [name=" + name + ", money=" + money + "]"; } public String getName() { return name; } public void setName(String name) { this.name = name; } public long getMoney() { return money; } public void setMoney(long money) { this.money = money; } } class Person2 implements Serializable { private static final long serialVersionUID = -7860166025209047988L; private String name; private int age; private Wallet2 wallet; public Person2(String name, int age, Wallet2 Wallet2) { this.name = name; this.age = age; this.wallet = Wallet2; } @Override public String toString() { return "Person2 [name=" + name + ", age=" + age + ", p=" + wallet + "]"; } public Object deepClone() throws Exception { ByteArrayOutputStream bao = new ByteArrayOutputStream() ; ObjectOutputStream oo = new ObjectOutputStream(bao) ; oo.writeObject(this); ByteArrayInputStream bai = new ByteArrayInputStream(bao.toByteArray()) ; ObjectInputStream oi = new ObjectInputStream(bai) ; Object obj = oi.readObject() ; return obj ; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Wallet2 getWallet2() { return wallet; } public void setWallet2(Wallet2 wallet) { this.wallet = wallet; } }
运行结果如下:
Person2 [name=curry, age=28, p=Wallet2 [name=LV, money=10000]]
Person2 [name=stu, age=30, p=Wallet2 [name=保罗, money=60]]
OK,done。
原文:http://www.cnblogs.com/jack2013/p/5200737.html