
正文
java克隆代码 java中克隆
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
java代码 clone()函数的作用是什么?
从楼主对回答java克隆代码的追问上发现java克隆代码,楼主的连JAVA基本的语法都很差啊。=号是赋值运算符java克隆代码,不是比较。
double[] vectorValue;
vectorValue = vectorValue.clone();
这个段代码执行肯定报错java克隆代码了。但java克隆代码他还的意思还是很明确的。
首先:double[] vectorValue; 这个是定义了一个double类型的数组变量vectorValue。
其次:vectorValue = vectorValue.clone(); //这个是将vectorValue 克隆一份,赋值给自己。也就是说vectorValue变量指向了新的一块内存区域。
举个例子可能更能说明问题。
public class TestMain implements Cloneable {
private int i ;
public TestMain(int i){
this.i = i ;
}
@Override
protected Object clone() {
// TODO Auto-generated method stub
return new TestMain(this.getI()+1);
}
public int getI() {
return i;
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
TestMain tm1 = new TestMain(1);
TestMain tm2 = tm1;
tm1 = (TestMain)tm1.clone();
System.out.println(tm1.getI()); //tm1指向的是通过clone()方法创建的新的对象的地址,i的值已经是2了。
System.out.println(tm2.getI()); //tm2指向的还是tm1创建时的地址,i的值为1
}
}
相关问答
Q1: java clone()方法
虽然clone是Object就有java克隆代码的方法java克隆代码,但是想用必须实现Cloneable接口java克隆代码,String没有实现这个接口
所以这么提示,The method clone() from the type Object is not visible
从Object继承过来的clone方法不可见
Q2: java如何实现对象的克隆
可以重载clone方法克隆对象
首先、该类要实现Cloneable的接口,不然执行clone方法的时候会抛出CloneNotSupportedException异常
然后、就在该类重载clone方法,自己加上克隆的逻辑,本人小白,手敲的代码
public class Book implement Cloneable{
private String name;
public Book(String name){
this.name=name;
}
@Override
public Book clone() throws CloneNotSupportedException {
return new Book(this.name);
}
}
Q3: java编程 克隆一个普通对象,克隆后的对象占有各自的堆内存,克隆一个对象数组,对象数组占有同一个内存
你要看具体的内部实现了 有的直接 另外new 一个肯定是两个不同的堆内存空间 只是把 所有的属性设置成相同 有的克隆 指向同一个对内存就是没有new
Q4: java中如何实现一个类的深克隆的代码
类的属性如果是引用类型的 那么继续执行属性的 clone方法即可(属性要实现Cloneable接口)
Q5: java如何实现对象的深克隆?
/**定义用户**/
publicclassUser{
privateStringname;
privateAddressaddress;
//constructors,gettersandsetters
}
/**地址**/
publicclassAddress{
privateStringcity;
privateStringcountry;
//constructors,gettersandsetters
}
重载clone()方法
Object父类有个clone()的拷贝方法,不过它是protected类型的,
我们需要重写它并修改为public类型。
除此之外,子类还需要实现Cloneable接口来告诉JVM这个类是可以拷贝的。
重写代码
让我们修改一下User类,Address类,实现Cloneable接口,使其支持深拷贝。
/**
*地址
*/
publicclassAddressimplementsCloneable{
privateStringcity;
privateStringcountry;
//constructors,gettersandsetters
@Override
publicAddressclone()throwsCloneNotSupportedException{
return(Address)super.clone();
}
}
/**
*用户
*/
publicclassUserimplementsCloneable{
privateStringname;
privateAddressaddress;
//constructors,gettersandsetters
@Override
publicUserclone()throwsCloneNotSupportedException{
Useruser=(User)super.clone();
user.setAddress(this.address.clone());
returnuser;
}
}
需要注意的是,super.clone()其实是浅拷贝,
所以在重写User类的clone()方法时,address对象需要调用address.clone()重新赋值。
扩展:
为什么要克隆?
大家先思考一个问题,为什么需要克隆对象?直接new一个对象不行吗?
答案是:克隆的对象可能包含一些已经修改过的属性,而new出来的对象的属性都还是初始化时候的值,所以当需要一个新的对象来保存当前对象的“状态”就靠clone方法了。那么我把这个对象的临时属性一个一个的赋值给我新new的对象不也行嘛?可以是可以,但是一来麻烦不说,二来,大家通过上面的源码都发现了clone是一个native方法,就是快啊,在底层实现的。
提个醒,我们常见的Objecta=newObject();Objectb;b=a;这种形式的代码复制的是引用,即对象在内存中的地址,a和b对象仍然指向了同一个对象。
而通过clone方法赋值的对象跟原来的对象时同时独立存在的。
java克隆代码的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java中克隆、java克隆代码的信息别忘了在本站进行查找喔。







