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

大家帮忙看看关于JPanel的clone()的问题
看一下代码:
public class CommonCondtionPanel extends JPanel implements Cloneable
{
    public Object clone()
    {
        CommonCondtionPanel condition=null;
        try
        {
            condition = (CommonCondtionPanel)super.clone();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        return condition;
    }
    public CommonCondtionPanel getConditionPanel(CommonCondtionPanel condition)
        throws Exception
    {
        CommonCondtionPanel conditionPanel = (CommonCondtionPanel)condition.clone();
    }
}  


在另一个类中我要多次调用CommonCondtionPanel :

CommonCondtionPanel  condition = new CommonCondtionPanel ();
{
   Test test1 = new Test(condition.getConditionPanel(condition ));
}
{
  Test test2 = new Test(condition.getConditionPanel(condition ));

}

老是抛出java.lang.CloneNotSupportedException:
网上的解释是:
Object类的这个clone方法完全是为了子类覆盖它服务的,并不是让子类直接调用的,这也就是为什么在覆盖clone方法时一般到调用super.clone()的原因。clone方法是可以被覆盖的,但是必须实现Cloneable接口,所以你覆盖后,它就不会调用父类的方法,而调用你覆盖后的方法。

求解,最好贴码易懂,灰常感谢

------解决方案--------------------
其实,个人觉得你没必要这么写,当然,你一定要这么写,我就试试 。
------
我尝试着分析你的程序,除了补充完整你的程序外,发现,其实你的程序很正确!、
真的,你的程序是正确的 。
你不信,请看下面一个完整的,模仿你的程序:
package com;

import javax.swing.JPanel;

public class Test {
public static void main(String[] args) throws CloneNotSupportedException {
A a = new A() ;
Test t1 = new Test(a.getConditionA(a)) ; 
Test t2 = new Test(a.getConditionA(a)) ; 
Test t3 = new Test(a.getConditionA(a)) ; 
Test t4 = new Test(a.getConditionA(a)) ; 
}
Test(A a ){

}
}

class A extends JPanel implements Cloneable{
@Override
public Object clone() throws CloneNotSupportedException {
A a = null ;
a = (A)super.clone();
return a ;
}
public A getConditionA(A condition) throws CloneNotSupportedException{
A a = (A) condition.clone() ;
return a;
}
}

new Test(a.getConditionA(a)) ;这一句也调用了4次,毫无问题!
--------------
1、或许你自己的程序那里不小心写错了吧 ?
2、其实你这个程序没有意义的,比如,假定我这里要clone的是一个关联了很多对象的类,那么要深拷贝,
可你的程序完全不合格了 !
我个人觉得,与其这样,倒不如用流来解决,当方便得多,虽然效率会低些 ...