栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Java克隆抽象对象

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java克隆抽象对象

您可以尝试使用反射:

public abstract class AClonable implements Cloneable{private String val;public AClonable(){}public AClonable(String s){    val=s;}public String toString(){    return val;}@Overridepublic AClonable clone(){    try {        System.out.println(getClass().getCanonicalName());        AClonable b= getClass().getDeclaredConstructor(String.class).newInstance(val);        return b;    } catch (InstantiationException e) {        // TODO Auto-generated catch block        e.printStackTrace();    } catch (IllegalAccessException e) {        // TODO Auto-generated catch block        e.printStackTrace();    } catch (IllegalArgumentException e) {        // TODO Auto-generated catch block        e.printStackTrace();    } catch (SecurityException e) {        // TODO Auto-generated catch block        e.printStackTrace();    } catch (InvocationTargetException e) {        // TODO Auto-generated catch block        e.printStackTrace();    } catch (NoSuchMethodException e) {        // TODO Auto-generated catch block        e.printStackTrace();    }    return null;}

}

在clone()方法中,调用getClass()。因为ACloneble ist抽象,所以那里的调用将始终转到具体的类。

   public class ClonebaleOne extends AClonable{public ClonebaleOne(){    super();}public ClonebaleOne(String s) {    super(s);    // TODO Auto-generated constructor stub}

}

  public class ClonebaleTwo extends AClonable{public ClonebaleTwo(){    super();}public ClonebaleTwo(String s) {    super(s);    // TODO Auto-generated constructor stub}

}

最后

   public static void main(String[] args){    AClonable one = new ClonebaleOne("One");    AClonable tow= new ClonebaleTwo("Two");    AClonable clone = one.clone();    System.out.println(clone.toString());    clone = tow.clone();    System.out.println(clone.toString());}

输出:

  ClonebaleOne  One  ClonebaleTwo  Two

但这不是解决方案,而是更多技巧

[编辑]我的两个克隆都比;)快

[编辑]要完成。clone()的另一个实现可以是

 @Overridepublic AClonable clone(){    try {        ByteArrayOutputStream outByte = new ByteArrayOutputStream();        ObjectOutputStream outObj = new ObjectOutputStream(outByte);        ByteArrayInputStream inByte;        ObjectInputStream inObject;        outObj.writeObject(this);        outObj.close();        byte[] buffer = outByte.toByteArray();        inByte = new ByteArrayInputStream(buffer);        inObject = new ObjectInputStream(inByte);        @SuppressWarnings("unchecked")        Object deepcopy =  inObject.readObject();        inObject.close();        return (AClonable) deepcopy;    } catch (Exception e) {        e.printStackTrace();    }    return null;}

当您的抽象类实现Serialazable时。在那里,您将对象写入光盘,并使用光盘中的值创建副本。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/463752.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号