java中的clone

clone构造器及其静态工厂的变形

优点:它们不依赖于某一种很有风险的,语言之外的对象创建机制;

它们不要求遵守尚未制定好文档的规范

他们不会于final域的正常使用发生冲突

它们不会抛出不必要的受检异常

它们不需要进行类型转换

/**

* 1.必须继承Cloneable接口

* 2.必须重写Object类中的clone()方法 –

* Cloneable接口改变了接口的通用规范,它改变了超类中受保护的方法的行为

* –无需构造器就可以创建对象

* a.clone对象分配有独立的内存地址 – x.clone()!=x;

* b.原始的克隆对象应该具有相同类型 x.clone().getClass == x.getClass 非必需

* c.原始的克隆对象调用equals方法的话,应该是相等的 非必需

* @author JacXuan

*

*/

public class Father implements Cloneable{
private int age;
private String name;
private Son son; public Father(int age,String name,Son son){
this.age = age;
this.name = name;
this.son = son;
} public Son getSon(){
return this.son;
}
public void setSon(Son son){
this.son = son;
}
/**
* 浅拷贝代码--
* 原始对象和克隆对象拥有指向同一对象的两个引用,所以可以通过改变cloneFather
* 中的Son来改变father中的Son对象
* @throws CloneNotSupportedException
*/
// @Override
// public Object clone() throws CloneNotSupportedException{
// return super.clone();
// } /**
* 深拷贝 -- 在Son中实现clone方法 return super.clone();
*/
@Override
public Object clone() throws CloneNotSupportedException{
Father father = (Father)super.clone();
father.setSon((Son)father.getSon().clone());
return father;
}
} Son son = new Son(20, "PG");
Father father = new Father(40, "JacX", son); Father cloneFather = (Father)father.clone();
System.out.println(father!=cloneFather);
System.out.println(cloneFather.getClass() == father.getClass());
System.out.println(cloneFather.equals(father)); 2.package com.object.equals.clone.conctr; /**
* 拷贝构造函数 -- 一种特殊的构造器
* 它将自己的类类型作为参数 传递一个类的实例给拷贝构造函数,
* 然后他将返回一个新的类实例
* @author JacXuan
*
*/
public class CloneConctr {
private Integer x;
private Integer y; public CloneConctr(CloneConctr cloneConctr){
this.x = cloneConctr.x;
this.y=cloneConctr.y;
} // public CloneConctr copyPoint(CloneConctr cloneConctr) throws CloneNotSupportedException{
// if(!(cloneConctr instanceof Cloneable)){
// throw new CloneNotSupportedException("Invalid clone");
// }
//
// //可以做多种其他事情
// return new CloneConctr(cloneConctr.x,cloneConctr.y);
// } /**
* 最佳实践
*1)当你不知道你是否可以调用clone()方法的类你不确定如果是在这个类中实现,
*您可以检查和检查如果类的实例“可克隆”界面如下。
*/
// if(obj instanceof Cloneable){
//obj2 = obj.clone();
//}
//Dont do this. Cloneabe dont have any methods
//obj2 = obj.clone();
} package com.object.equals.clone.conctr; /**
* 如果要继承它的话,则需要复制子类的参数并传递参数给父类的构造器
* @author JacXuan
*
*/
public class CloneConctr2 extends CloneConctr{
private Integer z; public CloneConctr2(CloneConctr2 cloneConctr2){
super(cloneConctr2);
this.z = cloneConctr2.z;
}
} 3.package com.object.equals.clone.hashtable; /**
* 解决克隆对象和原有对象引用链表相同引起的数据篡改 单独地拷贝并组成每个桶的链表
* 如果链表比较长,容易导致栈溢出
* @author JacXuan
*
*/
public class HashTable implements Cloneable {
private Entry[] buckets = null; private static class Entry {
final Object key;
Object value;
Entry next; Entry(Object key, Object value, Entry next) {
this.key = key;
this.value = value;
this.next = next;
} Entry deepCopy() {
//深度克隆 如果桶是空的,则clone下一个
return new Entry(key, value, next == null ? null : next.deepCopy());
}
} @Override
public HashTable clone() throws CloneNotSupportedException {
HashTable result = (HashTable) super.clone();
result.buckets = new Entry[buckets.length];
for (int i = 0; i < buckets.length; i++) {
if (buckets[i] != null) {
result.buckets[i] = buckets[i].deepCopy();
}
}
return result;
} }

EffectiveJava(11)Java中的clone的更多相关文章

  1. 深入理解Java中的Clone与深拷贝和浅拷贝

    1.Java对象的创建 clone顾名思义就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象.所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象. ...

  2. 详解Java中的clone方法

    详解Java中的clone方法 参考:http://blog.csdn.net/zhangjg_blog/article/details/18369201/ 所谓的复制对象,首先要分配一个和源对象同样 ...

  3. 浅拷贝和深拷贝(谈谈java中的clone)

    clone顾名思义就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象.所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象.那么在java语言中,有 ...

  4. Java中对Clone的理解

    面试中经常遇到Clone的相关知识,今天总算是把Clone理解的比较透彻了!Java中Clone的概念大家应该都很熟悉了,它可以让我们很方便的“制造”出一个对象的副本来,下面来具体看看java中的Cl ...

  5. 【转】java中的clone

    java中的clone Clone&Copy 假设现在有一个Employee对象,Employee tobby =new Employee("CMTobby",5000), ...

  6. JAVA中的clone方法剖析

    原文出自:http://blog.csdn.net/shootyou/article/details/3945221 java中也有这么一个概念,它可以让我们很方便的"制造"出一个 ...

  7. Java中的clone()----深复制,浅复制

    这篇文章主要介绍了Java中对象的深复制(深克隆)和浅复制(浅克隆) ,需要的朋友可以参考下 1.浅复制与深复制概念 ⑴浅复制(浅克隆) 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他 ...

  8. 详解Java中的clone方法:原型模式

    转:http://developer.51cto.com/art/201506/478985.htm clone顾名思义就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象.所谓的 ...

  9. 转:Java中的Clone()方法详解

    Java中对象的创建 clone顾名思义就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象.所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象.那 ...

随机推荐

  1. js判断对象是否为数组

    1.ECMAScript5中有一个现成的方法:Array.isArray(). var obj = {1:[1],2:[2]}, arr = [1], str = "1"; Arr ...

  2. Math对象常用方法

    1.Math.ceil(x) 返回x的向上取整. var a=Math.ceil(9.1); var b=Math.ceil(-9.1) console.log(a); console.log(b); ...

  3. 浅谈android Socket 通信及自建ServerSocket服务端常见问题

    摘  要:TCP/IP通信协议是可靠的面向连接的网络协议,它在通信两端各建立一个Socket,从而在两端形成网络虚拟链路,进而应用程序可通过可以通过虚拟链路进行通信.Java对于基于TCP协议的网络通 ...

  4. linux mint 自动挂载windows的D盘和E盘

    终端敲udisksctl mount -p block_devices/sda后双击tab键补全分区,如下:    如我的E盘是sda6,执行     udisksctl mount -p block ...

  5. 51nod 1851 俄罗斯方块

    玩过俄罗斯方块?那你知道俄罗斯方块共有七种吧(其实只有五种) 给一个黑白图,每次能将某些区域的格子黑白反转,至于某些区域的意思嘛,就是俄罗斯方块形状的区域咯(可水平翻转.上下翻转.旋转) 求能否将图变 ...

  6. php实现二维码

    封装函数 function verifyImage($len=3){ //session_start(); $scr="abcdefghijklmnoqprstuvwxyzABCDEFJHI ...

  7. 鸭子-策略模式(Strategy)

    前言 万事开头难,最近对这句话体会深刻!这篇文章是这个系列正式开始介绍设计模式的第一篇,所以肩负着确定这个系列风格的历史重任,它在我脑袋里默默地酝酿了好多天,却只搜刮出了一点儿不太清晰的轮廓,可是时间 ...

  8. MSSQL取得或删除重复数据

    1.取得不重复的数据 select * from Persons where Id in ( SELECT MAX(Id) AS Expr1 FROM Persons GROUP BY Name, G ...

  9. sql 事物 锁 快照(转发的,写的非常好)

    隔离级别定义事务处理数据读取操作的隔离程度,在SQL Server中,隔离级别只会影响读操作申请的共享锁(Shared Lock),而不会影响写操作申请的互斥锁(Exclusive Lock),隔离级 ...

  10. react className的2种变量写法

    ES6新增的不少语法都是极好用的, 在拼接变量与字符串时,模版字符串``就是典型的用法 以下是2种写法 <div className={"bubble-box" +' '+` ...