1、被克隆的类必须自己实现Cloneable 接口,以指示 Object.clone() 方法可以合法地对该类实例进行按字段复制。Cloneable 接口实际上是个标识接口,没有任何接口方法。
2、实现Cloneable接口的类应该使用公共方法重写 Object.clone(它是受保护的)。某个对象实现了此接口就克隆它是不可能的。即使 clone 方法是反射性调用的,也无法保证它将获得成功。
3、在Java.lang.Object类中克隆方法是这么定义的:
protected Object clone()
throws CloneNotSupportedException
创建并返回此对象的一个副本。表明是一个受保护的方法,同一个包中可见。
要产生一个副本,那副本要不要内存?----当然要了,那就对了!既然需要内存,(不克隆的情况下)你不new还有什么办法呢?请大家时刻铭记对象是Java运行时产生的,驻留在计算机内存中。
- /**
- *要实现克隆,必须实现Cloneable接口,这是一个标识接口,没有接口方法
- *实现了 Cloneable 接口,以指示 Object.clone() 方法可以合法地对该类实例进行按字段复制。
- *按照惯例,实现此接口的类应该使用公共方法重写 Object.clone(它是受保护的)。
- */
- class CloneA implements Cloneable {
- private String name ;
- private int age ;
- public CloneA (String name, int age) {
- this.setName(name) ;
- this.setAge(age) ;
- }
- public void setName(String name) {
- this.name = name ;
- }
- public String getName() {
- return this.name ;
- }
- public void setAge(int age) {
- this.age = age ;
- }
- public int getAge() {
- return this.age ;
- }
- /**
- * @return 创建并返回此对象的一个副本。
- * @throws CloneNotSupportedException
- */
- public Object clone () throws CloneNotSupportedException {
- //直接调用父类的clone()方法,返回克隆副本
- return super.clone() ;
- }
- }
- class CloneB implements Cloneable {
- private CloneA cloneA ;
- private Long l ;
- public CloneB (CloneA cloneA,Long l) {
- this.setCloneA(cloneA) ;
- this.setL(l) ;
- }
- public void setCloneA(CloneA cloneA) {
- this.cloneA = cloneA ;
- }
- public CloneA getCloneA() {
- return this.cloneA ;
- }
- public void setL (Long l) {
- this.l = l ;
- }
- public Long getL() {
- return l ;
- }
- public Object clone () throws CloneNotSupportedException {
- CloneB cloneB = (CloneB)super.clone() ;
- return cloneB ;
- }
- }
- public class ObjectClone {
- /**
- * @param args the command line arguments
- */
- public static void main(String[] args) {
- CloneA cloneA = new CloneA("yzhw", 23) ;
- CloneA cloneA1 = null ;
- try {
- cloneA1 = (CloneA)cloneA.clone() ;
- }catch(Exception e) {
- System.out.println(e.getMessage()) ;
- }
- System.out.println("cloneA :" + cloneA.getName() + cloneA.getAge()) ;
- System.out.println("cloneA1 : " + cloneA1.getName() + cloneA1.getAge()) ;
- System.out.println("+++++++++++++++++++++++++++++++++++++++") ;
- CloneB cloneB = new CloneB(cloneA ,new Long("12")) ;
- CloneB cloneB1 = null ;
- try {
- cloneB1 = (CloneB)cloneB.clone() ;
- }catch(Exception e) {
- System.out.println(e.getMessage()) ;
- }
- System.out.println("cloneB : " + cloneB.getCloneA().getName() + cloneB.getCloneA().getAge() + cloneB.getL()) ;
- System.out.println("cloneB1 : " + cloneB1.getCloneA().getName() + cloneB1.getCloneA().getAge() + cloneB1.getL()) ;
- }
- }