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

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

一个普通的Java类,继承了Object对象,便继承了该对象的Clone方法

protected native Object clone() throws CloneNotSupportedException;
但是Java基础类或String类却不支持这样的操作

Integer x = new Integer(10);x.clone(); //编译报错String s = "abc";s.clone(); //编译报错
可理解为,Integer类或者String类直接虽然继承了Object,在Integer或者String内部使可以访问clone方法的,由于该方法是protected限制级别。

Java对象Clone对象

     1.实现Cloneable接口。该接口标记类为可克隆的,Object.clone()方法会验证一个类是否实现了Cloneable接口,如果没有,在运行期会throw  CloneNotSupportedException。

     2.可覆盖clone方法,实现语境下的浅层复制或者深层复制。

     3.调用super.clone()方法。

一个简单的例子实现浅层复制

package clone;/** * 克隆研究 *  * @author xl * */public class Snake implements Cloneable {	Snake next;	char c;	// 构造器	public Snake(int i, char x) {		this.c = x;		if (--i > 0) {			next = new Snake(i, (char) (x + 1));		}	}	// 增量	public void increment() {		c++;		if (next != null) {			next.increment();		}	}	@Override	public String toString() {		String s = ":" + c;		if (next != null) {			s += next.toString();		}		return s;	}	@Override	protected Object clone() throws CloneNotSupportedException {		return super.clone();	}	public static void main(String[] args) throws CloneNotSupportedException {		Snake s = new Snake(5, 'a');		System.out.println("s = " + s);		Snake s2 = (Snake) s.clone();		System.out.println("s2 = " + s2);		System.out.println("s = " + s.next.hashCode() + ": " + s.c);		System.out.println("s2 = " + s2.next.hashCode() + ": " + s2.c);		//s2.increment();		System.out.println("after s.increment, s2 = " + s2);	}}
再次重载clone,可实现深层复制

@Override	protected Object clone() throws CloneNotSupportedException {		Snake s = null;		s = (Snake) super.clone();		if (s.next != null)			s.next = (Snake) s.next.clone();		return s;	}
克隆原理

Object.clone()方法负责建立正确的存储容量(原对象的大小),并通过“按位复制”将二进制位从原始对象中复制到新对象的存储空间。所以克隆的第一步应该调用super.clone()方法,为后续的复制建立基础,最后在自己的重载方法中完成必要的操作,以最终完成克隆。

转载地址:http://jrlbi.baihongyu.com/

你可能感兴趣的文章
Visual Studio 2010:C++0x新特性
查看>>
drwtsn32.exe和adplus.vbs进行dump文件抓取
查看>>
cppcheck c++静态代码检查
查看>>
CLOSE_WAIT和TIME_WAIT
查看>>
在C++中使用Lua
查看>>
在Dll中调用自身的位图资源
查看>>
IP校验和详解
查看>>
C++中使用Mongo执行count和distinct运算
查看>>
一些socket的编程经验
查看>>
socket编程中select的使用
查看>>
C++获取文件大小常用技巧分享
查看>>
未来5年大机遇:做贩卖多巴胺的超级玩家
查看>>
关于AIS编码解码的两个小问题
查看>>
GitHub 万星推荐:黑客成长技术清单
查看>>
可以在线C++编译的工具站点
查看>>
关于无人驾驶的过去、现在以及未来,看这篇文章就够了!
查看>>
所谓的进步和提升,就是完成认知升级
查看>>
昨夜今晨最大八卦终于坐实——人类首次直接探测到了引力波
查看>>
如何优雅、机智地和新公司谈薪水?
查看>>
为什么读了很多书,却学不到什么东西?
查看>>