当前位置:编程学习 > JAVA >>

java学习之路——对象的浅复制和深复制

 

对象的浅复制和深复制有两种方法:

第一种:通过重写clone()方法实现

1.浅复制与深复制概念

⑴浅复制(浅克隆)

    被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。

⑵深复制(深克隆)

    被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。换言之,深复制把要复制的对象所引用的对象都复制了一遍。

2.Java的clone()方法

⑴clone方法将对象复制了一份并返回给调用者。一般而言,clone()方法满足:

①对任何的对象x,都有x.clone() !=x//克隆对象与原对象不是同一个对象

②对任何的对象x,都有x.clone().getClass()= =x.getClass()//克隆对象与原对象的类型一样

③如果对象x的equals()方法定义恰当,那么x.clone().equals(x)应该成立。

⑵Java中对象的克隆

①为了获取对象的一份拷贝,我们可以利用Object类的clone()方法。

②在派生类中覆盖基类的clone()方法,并声明为public。

③在派生类的clone()方法中,调用super.clone()。

④在派生类中实现Cloneable接口。

例如:

 

package com.lcq.clone; 

/**

 * 

 * 类名:CloneTest1

 * 功能:对象的浅复制和深复制,通过继承Cloneable接口和重写clone()方法实现

 * 时间:

 * 

 * @version 1.0 

 * @author lcq

 *

 */ 

 

 

public class CloneTest1 { 

    public static void main(String[] args) throws Throwable { 

        Teacher teacher = new Teacher(); 

        teacher.setAge(20); 

        teacher.setName("teacher zhang"); 

        Student st = new Student(); 

         

        st.setAge(20); 

        st.setName("zhangsan"); 

        st.setTeacher(teacher); 

         

        //打印出Student对象的属性值 

        System.out.println("st age:" +st.getAge()); 

        System.out.println("st name:" +st.getName()); 

        System.out.println(st.getTeacher().getAge()); 

        System.out.println(st.getTeacher().getName()); 

        Student st2 = (Student)st.clone(); 

         

        //改变student的name值 

        st2.setName("lisi"); 

         

        //改变teacher对象的name属性值 

        teacher.setName("teacher name change");      

        System.out.println("st name:" + st.getName()); 

        System.out.println("st2 name:" + st2.getName()); 

         

        //打印出Student类对象的teacher属性值,其值没有改变。 

        System.out.println(st2.getTeacher().getName()); 

    } 

 

     

     

 

 

class Student implements Cloneable 

    //定义属性 

    private int age; 

    private String name; 

     

    //包含一个Teacher对象的引用 

    private Teacher teacher; 

    public Teacher getTeacher() { 

        return teacher; 

    } 

    public void setTeacher(Teacher teacher) { 

        this.teacher = teacher; 

    } 

    public int getAge() { 

        return age; 

    } 

    public void setAge(int age) { 

        this.age = age; 

    } 

    public String getName() { 

        return name; 

    } 

    public void setName(String name) { 

        this.name = name; 

    } 

     

    //重写父类的clone()方法,同时要保证其成员对象中也重写了父类的clone()方法 

    @Override 

    public Object clone() throws CloneNotSupportedException { 

        Student stu = (Student) super.clone(); 

        stu.setTeacher((Teacher)stu.getTeacher().clone()); 

         

        return stu; 

         

    } 

     

 

class Teacher implements Cloneable 

    //定义属性 

    private int age; 

    private String name; 

    public int getAge() { 

        return age; 

    } 

    public void setAge(int age) { 

        this.age = age; 

    } 

    public String getName() { 

        return name; 

    } 

    public void setName(String name) { 

        this.name = name; 

    } 

     

    //重写父类的clone()方法 

    @Override 

    protected Object clone() throws CloneNotSupportedException { 

        Object obj = super.clone(); 

        return obj; 

    } 

     

     

 

补充:软件开发 , Java ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,