Object类的clone方法如下定义
protected Object clone() // 创建并返回此对象的一个副本
这意味着:这只能在内部调用,外部不能像这样new XXOBJECT().clone()直接调用。
clone方法是本地方法,是native的,要想实现克隆功能,子类需要做到如下几步:
1 声明实现Cloneable接口(Object没有实现,所以会抛出异常,同时也说明子类需要克隆则也需要重写clone方法)。
2 调用super.clone得到一个对象(注意:对于基本数据类型和不可变类型(String)的克隆是相等且独立的,即操作互不影响)
3 把浅copy的引用指向原型对象新的克隆体
(引用类型如果不进行深拷贝,则clone出来的对象都指向同一个。
ArrayList克隆方法:
public Object clone() {
try {
ArrayList<E> v = (ArrayList<E>) super.clone();
//引用类型重新底层copy,使互不干扰
v.elementData = Arrays.copyOf(elementData, size);
v.modCount = 0;
return v;
} catch (CloneNotSupportedException e) {
// this shouldn't happen, since we are Cloneable
throw new InternalError();
}
}
)。
看下例子:
public class Test {
static class User implements Cloneable {
String name;
int age;
@Override
public User clone() throws CloneNotSupportedException {
return (User) super.clone();
}
}
static class Account implements Cloneable {
User user;
long balance;
@Override
public Account clone() throws CloneNotSupportedException {
Account account = (Account) super.clone();
if (user != null) {//user引用类型,如果不克隆的话,则user会互相影响操作,即操作的是同一对象
account.user = user.clone();
}
return account;
}
}
public static void main(String[] args) {
try {
User user = new User();
user.name = "cfx";
Account a1 = new Account();
a1.balance = 1000;
a1.user = user;
Account a2 = a1.clone();
System.out.println("clone对于基本数据类型和不可变类型(String)是相等且独立的");
System.out.println(a1.balance);
a1.balance = 20000;
System.out.println(a2.balance);
System.out.println("clone对于应用类型,克隆之后指向的是同一个对象,相互操作影响");
System.out.println(a2.user.name);
System.out.println(a2.user.name);
a1.user.name = "cfx2";
System.out.println(a2.user.name);
System.out.println(a2.user);//虽然指向的都是同一个内存地址,但user所有属性变量却不相同,这点确实有点怪
System.out.println(a2.user);
} catch (Exception e) {
e.printStackTrace();
}
}
问题来了,为什么要克隆?
试想一下,如果不clone(),那么如果你想副本对象跟原本对象具有相同值的属性,那么
你是不是需要写很多的代码来维护field...
再说,clone效率是很快滴...
分享到:
相关推荐
下面小编就为大家带来一篇java object 之clone方法全面解析。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
Object类中的clone方法clone()方法的作用克隆方法用于创建对象的拷贝,为了使用clone方法,类必须实现java.lang.Cloneable接口
Object.clone()地位冠军:待定作者:亚历克斯·洛尔舞台:0-稻草人动机使用散布运算符... ,可以很容易地对对象进行浅表克隆。 在某些情况下,需要创建对象的深层克隆。 本地复制引用的内存比手动克隆要有效得多。...
对象克隆ES5的深克隆和比较概要// just ... clone ( src ) ; // shallow copylog ( Object . is ( src , dst ) ) ; // falselog ( Object . equals ( src , dst ) ) ; // truedst . lang . push ( 'javascript' ) ;log
下面小编就为大家带来一篇深入理解JavaScript中的对象复制(Object Clone)。小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
深化理解JavaScript中的对象复制(Object Clone)_.docx
var clone = require ( '@dmail/object-clone' ) ; var a = { name : 'a' } ; var b = clone ( a ) ; b . name ; // 'a' // of course b != a 它克隆得很深 var a = { list : [ { name : 'first' } ] } ; var...
本案例代码将详细展示Object类的使用方法,并提供一些实际场景下的案例,以帮助开发者更好地理解和运用这些方法。 这份案例代码适合以下人群: Java初学者:如果你是刚开始学习Java编程,那么Object类是一个重要的...
Object.clone、Object.equals 的实现 将以下方法添加到 Object.prototype: Object.prototype.clone() 将一个对象克隆到另一个对象中 深克隆,无论多深 不克隆函数 - 出于性能原因保留对同一函数的引用 如果出于...
在windows下安装完后提示: Fatal error: Trying to clone an uncloneable object of class Imagick in C:\www\hx\pdf_to_png.php on line 17 使用IIS和Apache均会有这个提示。经多次测试后,发现两种解决方法: 1....
在windows下安装完后提示:Fatal error: Trying to clone an uncloneable object of class Imagick in C:\www\hx\pdf_to_png.php on line 17 使用IIS和Apache均会有这个提示。经多次测试后,发现两种解决方法: 1....
clone 操作符委托给实现它的任何对象的 clone 方法。 $ npm install --save pop-clone clone 方法接受一个值或对象图,并返回一个引用等效的对象图。 价值 深度,默认为无穷大 memo,一个可选映射,实现has和get...
主要介绍了java中的深拷贝和浅拷贝(clone()方法的重写、使用序列化实现真正的深拷贝),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
Clone方法 toString方法:表示返回对象的字符串表示形式 包名.类名@hashCode(内存地址) 打印对象时,默认调用 如果不是想使用object类,toString方法,可以重写此方法 equals方法 equals方法比较对象的是否相同 ==...
ros_object_map1引言ros_object_...2先决条件已安装3构建依赖 4号楼cd ~ /catkin_ws/srcgit clone https://github.com/intel/ros_object_analytics.gitgit clone https://github.com/intel/object_msgs.gitgit clone ...
提供了20道高难度的Java Object类面试题及详细答案解析,涵盖了equals()、hashCode()、toString()、clone()、finalize()等方法的重写和应用,以及对象的比较、克隆、标识哈希码等概念。适合准备Java面试的开发者深入...
console.log( DataType.Object.clone( { a : 1 } ) ); < / script > 网络工作者 importScripts ( "lib/DataType.js" ) ; console . log ( DataType . Object . clone ( { a : 1 } ) ) ; 节点.js var DataType ...