我发现clone没有完全克隆?为什么,请高手指教。
组件的继承关系:
JLabel->JParentLabel->BaseComponent->BaseLabel->Label
它们每个类都实现了implements java.lang.Cloneable接口,也重写了clone方法,除开BaseComponent组件后其它组件的代码量都很少,着重要BaseComponent类中处理许多事务。
JParentLabel->BaseLabel->Label三个类的clone的代码都是这样的格式:
public Object clone() throws CloneNotSupportedException{

JParentLabel jPL = null;

jPL = (JParentLabel) super.clone();

jPL.s = new BasicStroke();

return jPL;
BaseComponent类clone的方法体中加了一些对象的克隆,比如有Hashtable对象的克隆,具体如下:
//克隆
public Object clone() throws CloneNotSupportedException{

BaseComponent basecomponent = null;

basecomponent = (BaseComponent) super.clone();

basecomponent.hashtable = (Hashtable)hashtable.clone();

return basecomponent;

}
}
大致代码如下:
BaseComponent compA = new BaseComponent();compA.setToolTipText("compA");BaseComponent compB = (BaseComponent)compA.clone();compB.setToolTipText("compB");System.out.println(compA .getToolTipText());System.out.println(compB .getToolTipText());发现打印后的值都为“compB”,并且当我修改compB的宽高时,compA的宽高也被改了,但我跟踪发现hashtable是已经被克隆出来了,这是为何啊?求各位帮帮我!!!!!!!!

解决方案 »

  1.   

    有一段代码有误,是我没有写好:在“大致代码如下”处。
    应为:
    Label compA = new Label();compA.setToolTipText("compA");BaseComponent compB = (BaseComponent)compA.clone();compB.setToolTipText("compB");System.out.println(compA .getToolTipText());System.out.println(compB .getToolTipText());
      

  2.   

    clone 仅仅是二进制上的复制(浅复制),如果被复制的对象中含有引用,而这引用又没有clone功能,那么它复制的仅仅是它的地址.
      

  3.   

    clone都是浅拷贝,只有原始类型不是
      

  4.   

    确实BaseComponent类中还有一个对象band,它没有实现clone,为什么这个不需要clone的原因:它是克隆与被克隆的容器,我不需要去clone它.除了band和hashtable两个成员是对象外,其它都是原型成员
      

  5.   

    I try to create a new "BaseComponent",I think its very trouble.
      

  6.   

    use troublesome instead of trouble