⑴ java clone方法 怎么用
什么是"clone"?
在实际编程过程中,我们常常要遇到这种情况:
有一个对象A,在某一时刻中已经包含了一些有效值,此时可能会需要一个和A完全相同新对象B,并且此后对B任何改动都不会影响到A中的值,也就是说,A与B是两个独立的对象,但B的初始值是由A对象确定的。在 Java语言中,用简单的赋值语句是不能满足这种需求的。要满足这种需求虽然有很多途径,但实现clone()方法是其中最简单,也是最高效的手段。
Java的所有类都默认继承java.lang.Object类,在java.lang.Object类中有一个方法clone()。JDK API的说明文档解释这个方法将返回Object对象的一个拷贝。
要说明的有两点:
一是拷贝对象返回的是一个新对象,而不是一个引用。
二是拷贝对象与用 new操作符返回的新对象的区别就是这个拷贝已经包含了一些原来对象的信息,而不是对象的初始信息。
怎样应用clone()方法?
一个很典型的调用clone()代码如下:
{
publicintaInt;
publicObjectclone(){
CloneClasso=null;
try{
o=(CloneClass)super.clone();
}catch(CloneNotSupportedExceptione){
e.printStackTrace();
}
returno;
}
}
有三个值得注意的地方,
一是希望能实现clone功能的CloneClass类实现了Cloneable接口,这个接口属于java.lang 包,java.lang包已经被缺省的导入类中,所以不需要写成java.lang.Cloneable。
另一个值得请注意的是重载了clone()方 法。
最后在clone()方法中调用了super.clone(),这也意味着无论clone类的继承结构是什么样的,super.clone()直接或 间接调用了java.lang.Object类的clone()方法。下面再详细的解释一下这几点。
应该说第三点是最重要的,仔细观察一下Object类的clone()一个native方法,native方法的效率一般来说都是远高于java中的非native方法。这也解释了为 什么要用Object中clone()方法而不是先new一个类,然后把原始对象中的信息赋到新对象中,虽然这也实现了clone功能。对于第二点,也要 观察Object类中的clone()还是一个protected属性的方法。这也意味着如果要应用clone()方法,必须继承Object类,在 Java中所有的类是缺省继承Object类的,也就不用关心这点了。然后重载clone()方法。还有一点要考虑的是为了让其它类能调用这个clone 类的clone()方法,重载之后要把clone()方法的属性设置为public。
那么clone类为什么还要实现 Cloneable接口呢?稍微注意一下,Cloneable接口是不包含任何方法的!其实这个接口仅仅是一个标志,而且这个标志也仅仅是针对 Object类中clone()方法的,如果clone类没有实现Cloneable接口,并调用了Object的clone()方法(也就是调用了 super.Clone()方法),那么Object的clone()方法就会抛出CloneNotSupportedException异常。
⑵ 如何进行Java对象的克隆
以数组对象的克隆为例。
Java程序:
publicclassMain{
publicstaticvoidmain(String[]args){
int[]a={1,2,3};
int[]b=a.clone(); //b是a的克隆,a和b指向不同的数组
int[]c=a; //c是a的引用,a和c指向同一个数组
a[0]=10;
System.out.println("a[0]="+a[0]);
System.out.println("b[0]="+b[0]);
System.out.println("c[0]="+c[0]);
}
}
运行测试:
a[0]=10
b[0]=1
c[0]=10
自定义类的情况如下:
publicclassMain{
publicstaticvoidmain(String[]args){
Aa1=newA();
a1.name="Smith";
Aa2=a1;
Aa3=(A)a1.clone();
a1.name="White";
System.out.println("a1:"+a1.name);
System.out.println("a2:"+a2.name);
System.out.println("a3:"+a3.name);
}
}
classAimplementsCloneable{
publicStringname=null;
@Override
publicObjectclone(){
Aa=null;
try{
a=(A)super.clone();
}
catch(CloneNotSupportedExceptione){
e.printStackTrace();
}
returna;
}
}
运行测试:
a1:White
a2:White
a3:Smith
⑶ java浅拷贝的对象两个内向相等吗
两个对象内向相等。
java对象默认继承java。long。Object类,里面包含clone方法。JDKAPI的说明文档解释这个方法将返回Object对象的一个拷贝。要说明的有两点:一是拷贝对象是一个新对象,而不是一个引用。二是拷贝对象与用new操作符返回的新对象的区别就是这个拷贝已经包含了一些原来对象的信息,而不是对象的初始信息。
java中的基本数据类型判断是否相等,直接使用==就行了,相等返回true,否则,返回false。
⑷ java如何实现对象的克隆
可以重载clone方法克隆对象
首先、该类要实现Cloneable的接口,不然执行clone方法内的时候会抛出CloneNotSupportedException异常
然后容、就在该类重载clone方法,自己加上克隆的逻辑,本人小白,手敲的代码
{
privateStringname;
publicBook(Stringname){
this.name=name;
}
@Override
publicBookclone(){
returnnewBook(this.name);
}
}
⑸ 在java中,如何复制一个对象比如说string对象
可以使用clone来实制现,clone用于为引用类型的复制
1.使用clone方法的类必须先实现Cloneable接口,不然clone方法会直接返回CloneNotSupportedException不支持克隆的异常
2、实现Cloneable接口的类应该使用公共方法重写 Object.clone(它是受保护的)。某个对象实现了此接口就克隆它是不可能的。即使 clone 方法是反射性调用的,也无法保证它将获得成功。
3、在Java.lang.Object类中克隆方法是这么定义的:
protected Object clone()
throws CloneNotSupportedException
创建并返回此对象的一个副本。表明是一个受保护的方法,同一个包中可见。
按照惯例,返回的对象应该通过调用 super.clone 获得。
详见关于clone的API文档