博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java的Clone
阅读量:4634 次
发布时间:2019-06-09

本文共 3339 字,大约阅读时间需要 11 分钟。

Clone 就是重写clone()方法

两种办法进行深拷贝,一种是Clonable接口,一种是Serializable接口

实现代码如下

package Clone;public class Student implements Cloneable {  private String name;public String getName() {    return name;}public void setName(String name) {    this.name = name;}@Overrideprotected Object clone() throws CloneNotSupportedException{    return super.clone();}  }package Clone;import java.io.Serializable;public class StudentS implements Serializable{   /**     *      */    private static final long serialVersionUID = 1L;private  String name;public String getName() {    return name;}public void setName(String name) {    this.name = name;}   }package Clone;public class Teacher implements Cloneable{     private Student student;     private String name;    public Student getStudent() {        return student;    }    public void setStudent(Student student) {        this.student = student;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }        @Override    protected Object clone() throws CloneNotSupportedException{        Teacher teacher =(Teacher)super.clone();        teacher.student= (Student)student.clone();//这一句是clone  teacher里面的student的关键,少了就无法克隆成功。        return teacher;    }     }package Clone;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.io.Serializable;public class TeacherS implements Serializable{ private StudentS studentS; private String name;public StudentS getStudentS() {    return studentS;}public void setStudentS(StudentS studentS) {    this.studentS = studentS;}public String getName() {    return name;}public void setName(String name) {    this.name = name;}public Object clone(){                            try {        ByteArrayOutputStream bos= new ByteArrayOutputStream();        ObjectOutputStream oos= new ObjectOutputStream(bos);        oos.writeObject(this);        ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());        ObjectInputStream ois = new ObjectInputStream(bis);        return ois.readObject();    } catch (IOException e) {        // TODO Auto-generated catch block        e.printStackTrace();    } catch (ClassNotFoundException e) {        // TODO Auto-generated catch block        e.printStackTrace();    }                            return null;} }package Clone;public class Test {    public static void main(String[] args) throws CloneNotSupportedException {        Student student = new Student();        student.setName("xiaozhi");        Teacher teacher = new Teacher ();        teacher.setName("xiaozhi de laoshi");        teacher.setStudent(student);        Teacher teacher2 = (Teacher)teacher.clone();        System.out.println(teacher.getStudent()==teacher2.getStudent());                StudentS studentS = new StudentS();        studentS.setName("xiaozhi");        TeacherS teacherS = new TeacherS();        teacherS.setName("xiaozhi de laoshi");        teacherS.setStudentS(studentS);        TeacherS teacher2S = (TeacherS)teacherS.clone();     System.out.println(teacherS.getStudentS()==teacher2S.getStudentS());            }}//输出两个false,证明其内对象也进行了深拷贝,第二种方法比较简单,不用在每个内对象入studen都实现clone方法并在teacher进行返回设置

 

转载于:https://www.cnblogs.com/s1127736971/p/7665658.html

你可能感兴趣的文章
Android Acitivity 生命周期
查看>>
isolate 通信
查看>>
怎么将jenkins打包后的war自动部署到jetty上?
查看>>
#418 Div2 Problem B An express train to reveries (构造 || 全排列序列特性)
查看>>
QLocalServer与QLocalSocket进程通讯
查看>>
JavaWeb——jsp-config
查看>>
微信开放平台之公众号第三方平台开发及全网发布验证
查看>>
作业 3 应用分支与循环结构解决问题 统计字符个数
查看>>
Path Sum
查看>>
数据库Mysql的学习(八)-储存过程和事务和导入导出
查看>>
输出n行杨辉三角数
查看>>
VS2010创建ATL类时需要手动填写ProgID
查看>>
让Windows7运行速度更快的BIOS优化设置教程
查看>>
SER SERVER存储过程
查看>>
通过T-SQL语句实现数据库加解密功能
查看>>
VS 类快捷键
查看>>
ThInkPHP验证码不显示,解决方法汇总
查看>>
start_kernel---boot_init_stack_canary<四>
查看>>
tensorflow---alexnet training (tflearn)
查看>>
Dell 戴尔预装Windows8改成Windows7
查看>>