实在看不懂你所写的....基本和LZ说的差不多,比如说有下面的这样的类 public class A { ArrayList list; public A() { list = new ArrayList(); } }A a = new A(); A b = (A)a.clone();这样的结果默认情况下呢,a.list与b.list的值是一样,也就是指向了一个同一个对象,如果通过a.list操作,b.list也就被改变了. 浅克隆就是简单的成员复制.但成员所引用的对象没有得到复制.所以要覆盖clone方法,不但都有一个ArrayList类型的成员,而且这个成员所引用的<<<对象的内容>>>也一样的,但不是同一个.String a =new String("a"); String b = a;这时候可以说b是a的简单克隆.String a = new String("a"); String b = new String(a);这样可以理解为深克隆,两者的内容都是一样的.public class A { ArrayList list; public A() { list = new ArrayList(); } protect Object clone() { A b = new A(); b.list = this.list.clone(); return b; } }因为ArrayList的clone已经覆盖了Object的,所以这样就形成了深克隆.不覆盖那个方法的时候: A a = new A(); A b = (A)b.clone(); a.list==b.list-->true;覆盖方法之后 A a = new A(); A b = (A)b.clone(); a.list==b.list-->false;
还是不行 就算里面没有引用型变量,也还是得重写clone方法才能通过编译?? import java.util.*; class AboutClone { public Object clone() //去掉就不行了。 { return this; }} public class example3 { public static void main(String args[]) { AboutClone A=new AboutClone(), B=new AboutClone(); B=(AboutClone)A.clone(); //The method clone() from the type Object is not visible } }
因为clone()在Object里是被保护的啊.只能在它的子类中看到的啊 import java.util.*; public class example3 { public static void main(String args[]) { AboutClone A=new example3(), B=new example3 (); B=(example3)A.clone(); //The method clone() from the type Object is not visible } }这样就可以了啊,被保护和方法只能在它的本类和子类中可访问的.你所写的A.clone();是在example3类中访问,所以不行.
public class A
{
ArrayList list;
public A()
{
list = new ArrayList();
}
}A a = new A();
A b = (A)a.clone();这样的结果默认情况下呢,a.list与b.list的值是一样,也就是指向了一个同一个对象,如果通过a.list操作,b.list也就被改变了.
浅克隆就是简单的成员复制.但成员所引用的对象没有得到复制.所以要覆盖clone方法,不但都有一个ArrayList类型的成员,而且这个成员所引用的<<<对象的内容>>>也一样的,但不是同一个.String a =new String("a");
String b = a;这时候可以说b是a的简单克隆.String a = new String("a");
String b = new String(a);这样可以理解为深克隆,两者的内容都是一样的.public class A
{
ArrayList list;
public A()
{
list = new ArrayList();
}
protect Object clone()
{
A b = new A();
b.list = this.list.clone();
return b;
}
}因为ArrayList的clone已经覆盖了Object的,所以这样就形成了深克隆.不覆盖那个方法的时候:
A a = new A();
A b = (A)b.clone();
a.list==b.list-->true;覆盖方法之后
A a = new A();
A b = (A)b.clone();
a.list==b.list-->false;
class AboutClone
{
LinkedList list;
AboutClone()
{
list=new LinkedList();
}
public Object clone()
{
AboutClone A=new AboutClone();
A.list=(LinkedList)this.list.clone();
return A;
}
}
public class example3 {
public static void main(String args[])
{
AboutClone A=new AboutClone(),
B=new AboutClone();
B=(AboutClone)A.clone();
if(B.list==A.list)
{
System.out.println("true");
}
else
{
System.out.println("false");
}
}
}
自己写了一个,确实是这样,谢谢4楼的大哥了。
发现了另一个问题,所有的类不都是Object的子类么?
为什么我在写这个程序的时候,如果不要涉及深度克隆,我还是要自己重新再写一次Object clone这个方法?
如:
class AboutClone
{
LinkedList list;
AboutClone()
{
list=new LinkedList();
}
public Object clone()
{
return this;
}
}
还是不行
就算里面没有引用型变量,也还是得重写clone方法才能通过编译??
import java.util.*;
class AboutClone
{ public Object clone() //去掉就不行了。
{
return this;
}}
public class example3 {
public static void main(String args[])
{
AboutClone A=new AboutClone(),
B=new AboutClone();
B=(AboutClone)A.clone(); //The method clone() from the type Object is not visible }
}
import java.util.*;
public class example3 {
public static void main(String args[])
{
AboutClone A=new example3(),
B=new example3 ();
B=(example3)A.clone(); //The method clone() from the type Object is not visible }
}这样就可以了啊,被保护和方法只能在它的本类和子类中可访问的.你所写的A.clone();是在example3类中访问,所以不行.