1、那么重写了Object类中的clone(),为什么还要实现 Cloneable接口呢?
Cloneable接口是不包含任何方法的!仅仅是针对 Object类中clone()方法的,如果clone类没有实现(继承)Cloneable接口,并调用了Object的clone()方法(也就是调用了 super.Clone()方法),那么Object的clone()方法就会抛出CloneNotSupportedException异常。
2、为什么不写个myClone(),里面用new呢?
Object类的clone()一个native方法,native方法的效率一般来说都是远高于java中的非native方法。
3、Object类中的clone()是一个protected属性的方法。重载clone()方法要把clone()方法的属性设置为public。这样类外才能通过对象来调用(就像构造器一样,不设置成public总是不方便) 4、重写克隆示例(浅克隆)
public class text{ public static void main(String[] args) throws CloneNotSupportedException, InterruptedException { house myhouse=new house(101,100); myhouse.display(); house youhouse=(house) myhouse.clone(); youhouse.display(); } } class house implements Cloneable { private int id; private double area; private java.util.Date whenBuilt; public house(int id, double area) { this.id = id; this.area = area; whenBuilt = new java.util.Date(); } public void display() { System.out.println("id:" + id + " " + "area:" + area + " " + "when bulid:" + whenBuilt); } @Override public Object clone() throws CloneNotSupportedException { return super.clone(); } }这样为浅克隆,后面克隆出来的实例都共享一个data,可以改写为
@Override public Object clone() throws CloneNotSupportedException { house houseclone=(house)super.clone(); houseclone.whenbuilt=(java.util.Data)whenbulit.clone(); return houseclone; } }注意: clone出来的声明类型都是Object,需要强制类型转换 data中的clone()已经不知深浅,但可能是一些基本类型,浅也没关系。