目录
一、深浅拷贝的意义
浅拷贝
深拷贝
二、深浅拷贝举例
浅拷贝
深拷贝
一、深浅拷贝的意义
首先我们来了解一下深浅拷贝的意义
浅拷贝
浅拷贝是会将对象的每个属性进行依次复制,但是当对象的属性值是引用类型时,实质复制的是其引用,当引用指向的值改变时也会跟着变化。
深拷贝
深拷贝和浅拷贝是针对复杂数据类型(对象及数组)来说的,浅拷贝只拷贝一层,而深拷贝是层层拷贝。深拷贝复制变量值,对于非基本类型的变量,则递归至基本类型变量后,再复制。 深拷贝后的对象与原来的对象是完全隔离的,互不影响,对一个对象的修改并不会影响另一个对象。
二、深浅拷贝举例
浅拷贝
class Money{//钱
public double m=12.5;
}
class Human implements Cloneable{
private String name;//姓名
private int age;//年龄
public Money money=new Money();//钱
public Human(String name, int age) {
this.name = name;
this.age = age;
}
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 Money getMoney() {
return money;
}
public void setMoney(Money money) {
this.money = money;
}
@Override
public String toString() {
return "Human{" +
"name='" + name + '\'' +
", age=" + age +
", money=" + money +
'}';
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
public class Test {
public static void main(String[] args) throws CloneNotSupportedException {
Human human1=new Human("山西",15);
Human human2= (Human) human1.clone();
System.out.println(human1.getMoney().m);
System.out.println(human2.getMoney().m);
System.out.println("============");
human1.money.m=99;
System.out.println(human1.getMoney().m);
System.out.println(human2.getMoney().m);
}
}
此代码实现的为浅拷贝运行结果如下
我们可以看到 在修改human1的money类中的m也会改变human2的m值
在JVM中图像是这样的
因为clone克隆出的是human1的副本 克隆过来的依旧是存放的Money类的地址,所以修改是会被同步修改的 此为浅拷贝
深拷贝
class Money implements Cloneable{//钱
public double m=12.5;
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
class Human implements Cloneable{
private String name;//姓名
private int age;//年龄
public Money money=new Money();//钱
public Human(String name, int age) {
this.name = name;
this.age = age;
}
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 Money getMoney() {
return money;
}
public void setMoney(Money money) {
this.money = money;
}
@Override
public String toString() {
return "Human{" +
"name='" + name + '\'' +
", age=" + age +
", money=" + money +
'}';
}
@Override
protected Object clone() throws CloneNotSupportedException {
//return super.clone();
Human tmp=(Human)super.clone();
tmp.money=(Money)this.money.clone();
return tmp;
}
}
public class Test {
public static void main(String[] args) throws CloneNotSupportedException {
Human human1=new Human("山西",15);
Human human2= (Human) human1.clone();
System.out.println(human1.getMoney().m);
System.out.println(human2.getMoney().m);
System.out.println("============");
human1.money.m=99;
System.out.println(human1.getMoney().m);
System.out.println(human2.getMoney().m);
}
}
只需要对代码小做修改 看结果
我们可以看到 这么操作即可做到意义上的深拷贝
在JVM中图形是这样的
我们可以看到 human2所引用的Money类被重新克隆了副本 对象也发生了改变 所以两个其中一个改变不会影响到另一个,如此叫做深拷贝
深浅拷贝区分就是这样,使用类的克隆来理解是不是简单了呢?理解了快快点赞收藏!