Java浅拷贝和深拷贝概念以及实现
在Java语言中,因为有引用类型的变量,所以也会有浅拷贝与深拷贝的区别
但是对于Java中的基础类型byte boolean char short int long float double以及它们的封装类型都实现了深拷贝
浅拷贝代码示例
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。