java深拷贝和浅拷贝

1.浅拷贝与深拷贝

  浅拷贝又叫浅复制,将对象中的所有字段复制到新的对象(副本)中,所有的值类型、引用类型都会进行复制。

         注意:1、值类型复制到新副本中,新的副本对字段的赋值等操作,不会对原对象的字段值有任何影响;

                  2、引用类型复制到新的副本中,新的副本对引用类型中的字段赋值等操作,对原引用类型对象中的字段进行更                      改,引用类型只是复制了一个引用,并非创建了新的对象。

             如下实例代码:

            public class Person {
                    private String name;
                    private String sex;
                    private int age;
    
                    public Person(String name,String sex,int age){
                            this.name = name;
                            this.sex = sex;
                            this.age = age;
                       }
    
                    public Person(Person p){            
                            this.name = p.name;
                            this.sex = p.sex;
                            this.age = p.age; 
                        }


            //省略 set/get

public class Asian {
    private String skin;
    Person person;
    
    public Asian(String skin,Person person){
        this.skin = skin;
        this.person = person;                    //引用赋值
    }


 
public class Asian  implements Cloneable{
private String name;
    private String sex;
    private int age;
    Person person;
   
    public Asian(String name, String sex, int age, Person person) {
super();
this.name = name;
this.sex = sex;
this.age = age;
this.person = person;
}


public Object clone(){  
    Asian o=null;  
        try{  
            o=(Asian)super.clone();  
        }catch(CloneNotSupportedException e){  
            System.out.println(e.toString());  
        }  
        o.person=this.person;
        return o;  
    }  
   
public static void main(String[] args) {
Person person = new Person("张三", "女", 20); 
Asian asian1 = new Asian("王四", "男", 30, person);
System.out.println("name="+asian1.person.getName()+","+"age="+asian1.person.getAge());
Asian asian2=(Asian)asian1.clone();  
asian2.person.setName("王二"); 
asian2.person.setAge(15);
System.out.println("对新的副本的引用对象的字段赋值之后,打印asian1的引用对象:name="+asian1.person.getName()+","+"age="+asian1.person.getAge());
asian2.name="王老五";
asian2.age=80;
System.out.println("对新的副本值对象的字段赋值之后,打印asian1的值类型字段:name="+asian1.name+","+"age="+asian1.age);

}

//执行结果:

name=张三,age=20
对新的副本的引用对象的字段赋值之后,打印asian1的引用对象:name=王二,age=15
对新的副本值对象的字段赋值之后,打印asian1的值类型字段:name=王四,age=30

   由上执行结果,可以看出,浅拷贝对引用对象类型并不可靠。浅拷贝对引用类型的拷贝 只是一个对象引用,并不是新创建一个对象,所以对副本的修改,会对原来对象产生相应的影响。同时原对象的修改也会对副本产生影响。然而 值类型不会产生相应的影响。

深拷贝(深克隆) 

     将对象中的所有字段复制到新的对象中。不过,无论是对象的值类型字段,还是引用类型字段,都会被重新创建并赋值,对于副本的修改,不会影响到源对象本身,简而言之 就是创建了新的对象,开辟了新的空间,非原来的对象的引用。

 

猜你喜欢

转载自blog.csdn.net/j_loveyou/article/details/80270304