对象的克隆分为对象的浅克隆和深克隆

一、对象的浅克隆

注意事项:

1.如果一个对象需要调用clone的方法克隆,那么该对象必须要实现Cloneable接口

2.Cloneable对象只是一个标识对象,并没有方法

 public class demo1 {
public static void main(String[] args) throws Exception {
Person person = new Person("001","狗娃");
Person person2 = person.clone();
person2.setName("abd");
System.out.println(person.toString());
System.out.println(person2.toString());
}
}

输出结果?

编号:001姓名:狗娃
编号:001姓名:abd

3.对象的浅克隆,在克隆一个对象的时候,如果被克隆的对象中维护了另外一个类的对象,这时候只是克隆一个对象的地址而没有把另外一个对象也克隆一份。

如图所示,对象的浅克隆只是克隆了address对象的地址,这样我们修改p2对象的时候,会将其内存地址的内容一并修改,所以输出city结果是一样的。

4.对象的浅克隆,也不会调用到构造方法的。

二、对象的深克隆

对象的深克隆:对象的深克隆,就是利用了对象的输入输出流,把对象先写到文件里,然后再读取对象的信息,这个过程称为对象的深克隆。

 public class demo2 {
public static void main(String[] args) throws IOException, ClassNotFoundException {
Adress adress = new Adress("北京");
Person person = new Person("002","sony猪",adress);
writObj(person);
Person person2 = readObj(person);
person2.adress.city = "深圳";
System.out.println("person1:"+person.toString());
System.out.println("person2:"+person2.toString());
}
public static Person readObj(Person person) throws IOException, ClassNotFoundException{
FileInputStream fileInputStream = new FileInputStream("E:\\obj.txt");
ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
return (Person) objectInputStream.readObject();
}
public static void writObj(Person person) throws IOException{
//建立文件的输出流对像
FileOutputStream fileOutputStream = new FileOutputStream("E:\\obj.txt");
ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
objectOutputStream.writeObject(person);
objectOutputStream.close();
}
}

输出结果?

person1:编号:002姓名:sony猪 地址:北京
person2:编号:002姓名:sony猪 地址:深圳

Java基础学习 —— 对象的克隆的更多相关文章

  1. Java基础学习笔记总结

    Java基础学习笔记一 Java介绍 Java基础学习笔记二 Java基础语法之变量.数据类型 Java基础学习笔记三 Java基础语法之流程控制语句.循环 Java基础学习笔记四 Java基础语法之 ...

  2. 转载-java基础学习汇总

    共2页: 1 2 下一页  Java制作证书的工具keytool用法总结 孤傲苍狼 2014-06-24 11:03 阅读:25751 评论:3     Java基础学习总结——Java对象的序列化和 ...

  3. JAVA基础学习-集合三-Map、HashMap,TreeMap与常用API

    森林森 一份耕耘,一份收获 博客园 首页 新随笔 联系 管理 订阅 随笔- 397  文章- 0  评论- 78  JAVA基础学习day16--集合三-Map.HashMap,TreeMap与常用A ...

  4. 尚学堂JAVA基础学习笔记

    目录 尚学堂JAVA基础学习笔记 写在前面 第1章 JAVA入门 第2章 数据类型和运算符 第3章 控制语句 第4章 Java面向对象基础 1. 面向对象基础 2. 面向对象的内存分析 3. 构造方法 ...

  5. [转帖]java基础学习总结——多态(动态绑定)

    https://www.cnblogs.com/xdp-gacl/p/3644035.html 多态的概念 java基础学习总结——多态(动态绑定) 一.面向对象最核心的机制——动态绑定,也叫多态

  6. Java基础学习(2)

    Java基础学习(二) 面向对象 对象:客观存在的事物 面向对象:人具体关注的事物的某些信息 类:是模子,确定对象会拥有的特征(属性)和行为(方法) 对象的属性:对象具有的各种特征 对象的方法:对象能 ...

  7. Java基础学习(4)

    Java基础学习(四) String类 特点:创建后不可再修改,看起来的修改只是创建了新的对象 常用方法 StringBuilder类 目的:解决String类频繁创建对象的问题 常用方法 特点:非线 ...

  8. Java基础学习-- 继承 的简单总结

    代码参考:Java基础学习小记--多态 为什么要引入继承? 还是做一个媒体库,里面可以放CD,可以放DVD.如果把CD和DVD做成两个没有联系的类的话,那么在管理这个媒体库的时候,要单独做一个添加CD ...

  9. Java基础学习中一些词语和语句的使用

    在Java基础学习中,我们刚接触Java会遇到一些词和语句的使用不清的情况,不能很清楚的理解它的运行效果会是怎么样的,如:break,continue在程序中运行效果及跳转位置, 1.先来看看brea ...

随机推荐

  1. python的__init__几种方法总结

    参考 __init__() 这个方法一般用于初始化一个类 但是 当实例化一个类的时候, __init__并不是第一个被调用的, 第一个被调用的是__new__ #!/usr/bin/env pytho ...

  2. jsp页面中某个src,如某个iframe的src,应该填写什么?可以是html、jsp、servlet、action吗?是如何加载的?

    jsp页面中某个src,如某个iframe的src,应该填写什么?可以是html.jsp.servlet.action吗?是如何加载的? 如有个test工程,其某个jsp中有个iframe,代码如下: ...

  3. github 上传下载代码简单使用

    很长时间,一直认为github很难操作,其实认真学了发现也不是很困难. 主要就3个命令 git clone 建立空间 git push 提交代码,git pull拉取代码. git clone htt ...

  4. solr6.5 的安装与配置

    运行环境: JDK:    1.8.0_131 Tomcat: 9.0.0.M21 Solr:      6.5.1 注:1.建议打开两个连接linux的窗口,一个负责 solr压缩目录,另外一个负责 ...

  5. viewpager+layout布局文件随数据多少创建滑动页面

    近期在做一个答题类型的APP,而其中最重要的是答题卡.而答题卡要如何做? 1.将数据插入到SQLite数据库中 2.建立entity实体包,创建实体类,封装. 3.创建实体与view的List集合 4 ...

  6. PHP+ajaxForm异步带进度条上传文件实例

    在使用ajaxForm方法之前,首先需要安装form.js的插件,网上有: 一.首先说用法,ajaxForm可以接收0或1个参数,该参数可以是一个变量.一个对象或回调函数,这个对象主要有以下参数: v ...

  7. C#委托和事件?策略模式?接口回调?还不清楚的赶紧来看我扯

    早前学习委托的时候,写过一点东西,今天带着新的思考和认知,再记点东西.这篇文章扯到设计模式中的策略模式,观察者模式,还有.NET的特性之一--委托.真的,请相信我,我只是在扯淡...... 场景练习 ...

  8. NOIP 2002 提高组 字串变换

    题目描述 已知有两个字串 A, B 及一组字串变换的规则(至多6个规则): A1 -> B1 A2 -> B2 规则的含义为:在 A$中的子串 A1 可以变换为 B1.A2 可以变换为 B ...

  9. C#基础课堂笔记

    第三章:运算符和表达式 1.认识运算符:运算符又叫操作符,是一个运用于运算的符号,它作用于一个或多个操作数 运算符的分类:      (1)按操作数量  一元(目)运算符    作用于一个操作数  二 ...

  10. 接口的作用(C#)

    C#中的接口(Interface)对于很多初学者来说是个很容易迷糊的东西,使用起来很简单,无非就是定义接口,接口里面包含一些属性.索引器.事件和一些没有修饰符的方法,也没有方法的具体实现代码:然后在类 ...