当前位置: 首页 > news >正文

(31)对象的克隆

对象的克隆,前提,对象对应的类,应当事先Clonable接口(便直接扣)

  浅克隆:就是调用对象的clone方法

  深克隆:就是对象的放序列化

对象浅克隆需要注意的细节

1、如果一个对象要调用clone方法方法克隆,该对象所属的类必须要实现Cloneable接口

2、Cloneable接口只是一个标志接口,没有任何的方法

3、对象的浅克隆就是克隆一个对象的时候,如果被克隆的对象中维护了另外一个类的对象,这时候只是克隆另外一个对象的地址,而没有

把另外一个对象也克隆一份.不然就要使用对象的深克隆

4、对象的浅克隆也不会调用构造方法,之前对象的反序列化也不会调用构造方法。

 1 package review.test;
 2 
 3 import java.io.Serializable;
 4 
 5 class Address{
 6     String city;
 7     public Address(String city) {
 8         this.city = city;
 9     }
10 }
11 
12 class Student implements Serializable, Cloneable
13 {
14     int id;
15     String name;
16     Address address;
17     
18     public Student(int id, String name) {
19         this.id = id;
20         this.name = name;
21     }
22     
23     public Student(int id, String name, Address address) {
24         this.id = id;
25         this.name = name;
26         this.address = address;
27     }
28     @Override
29     public Object clone() throws CloneNotSupportedException {
30         // TODO Auto-generated method stub
31         return super.clone();
32     }
33 }
34 
35 public class Demo2 {
36     public static void main(String[] args) {
37         try {
38             Address address = new Address("阜阳");
39             Student stu1 = new Student(68, "yuchen", address);
40             Student stu2 = (Student) stu1.clone();
41             
42             System.out.println(stu1.address);
43             System.out.println(stu2.address);
44             
45             
46             
47         } catch (CloneNotSupportedException e) {
48             throw new RuntimeException(e);
49         }
50     }
51 }

这里注意:

  clone方法是object里面的一个protected方法,protected之内在本类以及子类中看的见,别的类中是无法直接使用的。这是我们采取的策略使在Person类中重写clone方法,子类的访问权限可以比父类的大,我们把子类clone方法的访问权限改为public,这样在Demo2方法中就能直接调用stu.clone()方法,否则将会报错"this method is not visible".

接着看下面是对象的深克隆:

对象的深克隆:对象的深克隆就是利用了对象的输入输出流,先把对象写到文件上,然后再读出来,这个过程叫做对象的深克隆

其实就是对象的序列化,这一块别忘了前面介绍到的,对象的序列化的时候要实现标志类Serializable

ObjectInputStream 对象的输入流  都不具备读写能力

ObjectOutputStream 对象的输出流

Demo2 对象的深克隆

 1 public class Demo2 {
 2     public static void main(String[] args) throws IOException, ClassNotFoundException {
 3         Address address = new Address("阜阳");
 4         Person p1 = new Person(110, "狗娃", address);
 5         
 6         writeObj(p1);
 7         
 8         Person p2 = readObj();
 9         
10         p2.address.city = "长沙";
11         System.out.println("p1 = "+p1);
12         System.out.println("p2 = "+p2);
13     }
14     
15     //再从文件中读取对象的信息
16     public static Person readObj() throws IOException, ClassNotFoundException
17     {
18         ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream("F:\\obj.txt"));
19         
20         return (Person) inputStream.readObject();
21     }
22     
23     
24     //先要把对象写到文件上
25     public static void writeObj(Person p) throws IOException
26     {
27         ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("f:\\obj.txt"));
28         
29         objectOutputStream.writeObject(p);
30         
31         //关闭资源
32         objectOutputStream.close();
33     }
34 }
View Code

 

转载于:https://www.cnblogs.com/OliverZhang/p/6027174.html

相关文章:

  • SQL优化 CREATE STATISTICS
  • quartz2的example3--CronTriggerExample
  • ubuntu 14 中tomcat的开机启动设置
  • Java豆瓣电影爬虫——抓取电影详情和电影短评数据
  • InitialContext和lookup
  • 转】Mahout分步式程序开发 聚类Kmeans
  • Python 查看QQ状态
  • 前端弹出层框架layer
  • expect的超时处理
  • 自定义QGraphicsItem
  • FZU-2087 统计树边(最小生成树)
  • 选购线PHPUnit最佳实践:从入门到精通
  • 日常小算法
  • Cacti 监控流入流出差并作阈值报警
  • 精通Web Analytics 2.0 (7) 第五章:荣耀之钥:度量成功
  • [数据结构]链表的实现在PHP中
  • Angular 4.x 动态创建组件
  • jquery ajax学习笔记
  • MobX
  • vue-cli在webpack的配置文件探究
  • vue的全局变量和全局拦截请求器
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 不上全站https的网站你们就等着被恶心死吧
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 诡异!React stopPropagation失灵
  • 和 || 运算
  • 基于web的全景—— Pannellum小试
  • 前端面试之闭包
  • 一起来学SpringBoot | 第三篇:SpringBoot日志配置
  • 在Mac OS X上安装 Ruby运行环境
  • raise 与 raise ... from 的区别
  • 回归生活:清理微信公众号
  • ​软考-高级-信息系统项目管理师教程 第四版【第19章-配置与变更管理-思维导图】​
  • #NOIP 2014# day.1 T3 飞扬的小鸟 bird
  • #QT(一种朴素的计算器实现方法)
  • #经典论文 异质山坡的物理模型 2 有效导水率
  • #我与Java虚拟机的故事#连载12:一本书带我深入Java领域
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • $(function(){})与(function($){....})(jQuery)的区别
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (多级缓存)缓存同步
  • (数据结构)顺序表的定义
  • (四)linux文件内容查看
  • (算法)Travel Information Center
  • (一)基于IDEA的JAVA基础10
  • .a文件和.so文件
  • .bat批处理(一):@echo off
  • .mysql secret在哪_MySQL如何使用索引
  • .Net+SQL Server企业应用性能优化笔记4——精确查找瓶颈
  • .NET设计模式(2):单件模式(Singleton Pattern)
  • .NET使用存储过程实现对数据库的增删改查
  • @Autowired 与@Resource的区别
  • @param注解什么意思_9000字,通俗易懂的讲解下Java注解