Java中拷贝问题

除了String类型,其他的引用类型在使用=号赋值的时候,会将地址传给=号左侧

1
2
3
User a = new User();
User b = a;
//这里的b其实是获得了a的地址,后面继续操作b的话,相当于操作a

要解决这样的问题就需要用到浅拷贝和深拷贝了

浅拷贝

实体类实现接口

1
2
3
4
5
6
7
8
  // Cloneable标记此类可以进行克隆操作,没有其他实际意义
public class User implements Cloneable{

//重写clone方法
public User clone() throws CloneNotSupportedException{
return (User)super.clone;
}
}

浅拷贝有缺点,就是当类中有数组或者其他类成员的时候,还是会出现赋值地址的问题,所以就需要用到深拷贝

深拷贝

1
2
3
4
public class User{
private User2 user2;
private String[] hobby;
}

这个时候浅拷贝是解决不了这个问题的

对象有两种解决方案

  1. new新的对象,然后赋值给user2

    1
    2
    3
    4


    User2 user2 = new User2(clone.getUser().属性,属性2....);
    clone.setUser2(user2);
  2. 在成员类里面先进行浅拷贝,然后再将返回的对象赋值给成员类

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    public class User2 implements Cloneable{

    public User2 clone() throws CloneNotSupportedException{
    return (User2)super.clone;
    }

    }
    public class User{    
    private User2 user2;    
    private String[] hobby;
    User clone = (User) super.clone();

    User2 user2 = clone.getUser2().clone();
    clone.setUser2(user2);
    }

数组要容易些

直接用copyOf对原数组进行覆盖即可