对象的clone

一、为使一个对象能够实现克隆,需实现Cloneable接口,并加入clone()方法,Object类中clone()是protected类型,这里需将其设为publlic;在LocalCopy中,g()和f()方法揭示了两种参数传递方法的差异,其中g()演示的是按引用传递,它会修改外部对象,并返回对那个外部对象的一个引用,而f()是对自变量的克隆,所以将其分离出来,并让原来的对象保持独立,随后,它继续做它希望的事情,甚至能返回这个新对象的句柄,而且不会对原来的对象产生任何副作用,v = (MyObject)v.clone();它的作用正是创建一个本地副本

class MyObject implements Cloneable{

int i;
public MyObject(int ii){i = ii;} 
public Object clone(){
Object o = null;
try {
o = super.clone();
} catch (CloneNotSupportedException e) {
System.out.println("MyObject can not clone");
}
return o;
}
@Override
public String toString() {
return Integer.toString(i);
}
}
public class LocalCopy{
static MyObject g(MyObject v){
v.i ++;
return v;
}
static MyObject f(MyObject v){
v = (MyObject)v.clone();
v.i ++;
return v;
}
public static void main(String[] args) {
MyObject a = new MyObject(11);
MyObject b = g(a);
if(a.equals(b)){
System.out.println("a == b");
}else{
System.out.println("a != b");
}
System.out.println("a = " + a);
System.out.println("b = " + b);
MyObject c = new MyObject(47);
MyObject d = f(c);
if(c.equals(d)){
System.out.println("c == d");
}else{
System.out.println("c != d");
}
System.out.println("c = " + c);
System.out.println("d = " + d);
}

}

结果:

a == b
a = 12
b = 12
c != d
c = 47
d = 48

你可能感兴趣的:(java基础知识)