日期:2014-05-20  浏览次数:21185 次

克隆对象时,为什么要调用父类的 clone() 方法,这里又不是要克隆父类对象。
class   Test   implements   Cloneable
{
Object   o=null;
String   name;

Test(String   name)
{
this.name=name;
}

public   Object   clone()
{
try
{
o=super.clone();           //为什么要调用这句?
}
catch(Exception   e)
{
System.out.println(e.toString());
}
return   o;
}
}

super.clone();   调用父类的   clone()   方法,这里又不是要复制父类对象。


------解决方案--------------------
子类对象实际上是在父类对象的基础上做了一些扩展(extension),extends关键词就说明了这一点,所以,任何一个子类对象实际中其中有一部分是存储的父类对象的数据,也正是这个原因,一个子类对象才可以向上转型为父类的对象。
调用super.clone();就表示在复制子类对象的时候,一定要使得父类对象的那部分数据能够得到复制。
------解决方案--------------------
子类是父类的扩展 你只有一层一层的调用父类的clone方法 才能最终获得子类的实例 你新建一个对象的时候不是也要先调用父类的构造函数么!
------解决方案--------------------
若一个对象持有指向其他对象的引用,如果克隆时能够同时把指向的对象克隆一份,这就是深层克隆,而浅层克隆就是只复制引用,而不会把指向的对象克隆一份。
建议读一读《Thinking in java》,附录中有一部分讲这个。
------解决方案--------------------
复制分为深复制和浅复制两种,所谓浅复制就是说最终返回的对象,其内部成员和原始对象的内部成员指向同一位置,只不过是别名而已;而深复制,就是说最终返回的对象,其内部成员都是在内存中分配了空间的独立对象。下面给个深复制的例子:
注:上面说的内部成员是指对象,不包括原始类型(int,float等)。
/**
* 实现深复制,通过 (前提,该对象中的各个属性都是可serielization的)
* @return Object
*/
public Object clone(){
ByteArrayOutputStream oo = new ByteArrayOutputStream();
ObjectOutputStream out = null ;
try {
out = new ObjectOutputStream(oo);
}
catch (IOException ex) {
}

try {
out.writeObject(this);
}
catch (IOException ex1) {
}

ByteArrayInputStream ii = new ByteArrayInputStream(oo.toByteArray());
ObjectInputStream in = null;
try {
in = new ObjectInputStream(ii);
}
catch (IOException ex2) {
}

try {
return in.readObject();
}
catch (ClassNotFoundException ex3) {
return null;
}
catch (IOException ex3) {
return null;
}
}
------解决方案--------------------
clone()方法是Object类的一个proteced方法.有就是说,不能直接去调用它.只有在某一个类里面才能调用这一个类的对象.这种限制当然有他的一定道理.至于为什么我就懒得去研究了,发时间在这不如发时间去看点其他东西.
然后一点就是重写默认的 clone方法,必须使用super.clone()方法,调用父类的clone方法.
重写这个默认的clone方法,还是要把浅克隆通过super.clone()方法实现深克隆.不知道能不能这么说明...最少偶是明白了这个道理了的=.-=
------解决方案--------------------
Object 类的 clone 方法执行特定的克隆操作。首先,如果此对象的类不能实现接口 Cloneable,则会抛出 CloneNotSupportedException。。否则,此方法会创建此对象的类的一个新实例,并像通过分配那样,严格使用此对象相应字段的内容初始化该对象的所有字段;这些字段的内容没有被自我克隆。所以,此方法执行的是该对象的“浅表复制”,而不“深层复制”操作。