目录
首先我们来了解一下深浅拷贝的意义
浅拷贝是会将对象的每个属性进行依次复制,但是当对象的属性值是引用类型时,实质复制的是其引用,当引用指向的值改变时也会跟着变化。
深拷贝和浅拷贝是针对复杂数据类型(对象及数组)来说的,浅拷贝只拷贝一层,而深拷贝是层层拷贝。深拷贝复制变量值,对于非基本类型的变量,则递归至基本类型变量后,再复制。 深拷贝后的对象与原来的对象是完全隔离的,互不影响,对一个对象的修改并不会影响另一个对象。
-
- 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类被重新克隆了副本 对象也发生了改变 所以两个其中一个改变不会影响到另一个,如此叫做深拷贝
深浅拷贝区分就是这样,使用类的克隆来理解是不是简单了呢?理解了快快点赞收藏!