Object.clone()方法
来源:互联网 发布:淘宝刷流量会封店吗 编辑:程序博客网 时间:2024/05/17 02:04
Object.clone()方法用于对象的拷贝,它会把在堆上的对象所占用的内存空间拷贝一份然后返回,这样就形成一个新的对象(个人理解)。因为每个对象所占的空间内都有一个指向其类数据的指针,也就是指向方法区中类数据(这个类数据可以通过Class对象进行访问,可以简单、直接的理解为就是指向代表其类的Class对象)。JVM会通过这个指针来判断一个对象的类型,由于把整个对象空间拷贝,所以拷贝的对象的类指针也指向相同的类对象,这就确保了obj.clone().getClass()==obj.getClass(),即它们具有相同的类型。还有一点,因为只是简单的将对象的空间进行复制,所以如果类具有引用类型的实例变量的话,也只是将这个引用进行拷贝,并不复制其引用的对象。这就导致拷贝对象的引用实例变量与原对象的指向相同的对象,这就是传说中的“浅拷贝”。如果实例变量引用的对象是不可变的,类似于String,则拷贝对象与原对象不能互相影响,这样的拷贝是成功的。但是如果引用的是可变对象,它们就会影响彼此,对于成功的拷贝而言,这是不允许的。可以对可变的实例变量对象进行特殊处理,以实现拷贝对象和原对象不能相互影响的“深拷贝”。
由于Object.clone()方法是protected的,所以它只能在lang包中的类或是其子类的方法内部被调用,所以,如果像下面这样调用,会编译出错,在Person kobe_bak=kobe.clone();报错,说clone只能在Object的protected作用域访问。
既然,clone方法的作用域限制不允许我们在其它地方访问,那我们就重写Object的clone方法,并扩大访问作用域为public,在Person类中添加clone的方法重写,调用super.clone(),也就是Object.clone()。
然后编译,可以通过,接着运行程序,结果在Person kobe_bak=kobe.clone();抛出CloneNotSupportedException异常。这是因为Java只有一个类实现了Cloneable接口,才表示这个类可以被克隆。所以要想拷贝一个类的对象,必须让它实现Cloneable接口。这个接口只是一个标记接口,没有声明任何方法。
接下来,让Person类实现Cloneable接口,然后编译,运行,这个对象就被成功的克隆了。所以要想一个类可以被clone,必须满足两点,第一,它必须实现了Cloneable接口,否则会抛出CloneNotSupportedException异常;第二,它必须提供一个public的clone方法,也就是重写Object.clone()方法,否则编译不能通过。第三,对于存在可变域的类,在clone方法中需要对这些可变域进行拷贝。
- Object.clone()方法
- Object的clone方法
- Object中的clone方法
- Object.clone()方法
- Object 的clone方法
- Object的clone方法
- Object分析--1、clone()方法
- Object类中的clone方法
- Java Object的clone方法
- Object对象的通用方法-clone
- Java Object对象之clone方法
- C# 关于Object的Clone方法
- Object类(一)Clone方法
- 关于Object.clone克隆方法的测试
- java Object类 clone()方法 详解
- Cloneable接口和Object的clone()方法
- Java Object对象之clone方法
- Java Object对象之clone方法
- Reapter入门1
- serv-u右下角有个黄色感叹号闪动
- DSP2812的标准CMD文件
- Myeclipse中编译出现的问题,没怎么看懂什么意思
- 利用Tomcat建立多个Web Server的方法
- Object.clone()方法
- 如何学好C语言(转)
- 欧拉常数
- 严重: Exception starting filter struts2
- NetBeans 时事通讯(刊号 # 141 - Mar 30, 2011)
- boost asio 学习总结之 io_service
- FLEX 学习资料
- 编程术语中英对照表
- 关于lib文件 和 DLL文件