大家帮忙看看关于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的是一个关联了很多对象的类,那么要深拷贝,
可你的程序完全不合格了 !
我个人觉得,与其这样,倒不如用流来解决,当方便得多,虽然效率会低些 ...