一个普通的Java类,继承了Object对象,便继承了该对象的Clone方法
protected native Object clone() throws CloneNotSupportedException;
Integer x = new Integer(10); x.clone(); //编译报错 String s = "abc"; s.clone(); //编译报错
Java对象Clone对象
1.实现Cloneable接口。该接口标记类为可克隆的,Object.clone()方法会验证一个类是否实现了Cloneable接口,如果没有,在运行期会throw CloneNotSupportedException。
2.可覆盖clone方法,实现语境下的浅层复制或者深层复制。
3.调用super.clone()方法。
一个简单的例子实现浅层复制
package clone; /** * 克隆研究 * * @author xl * */ public class Snake implements Cloneable { Snake next; char c; // 构造器 public Snake(int i, char x) { this.c = x; if (--i > 0) { next = new Snake(i, (char) (x + 1)); } } // 增量 public void increment() { c++; if (next != null) { next.increment(); } } @Override public String toString() { String s = ":" + c; if (next != null) { s += next.toString(); } return s; } @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } public static void main(String[] args) throws CloneNotSupportedException { Snake s = new Snake(5, 'a'); System.out.println("s = " + s); Snake s2 = (Snake) s.clone(); System.out.println("s2 = " + s2); System.out.println("s = " + s.next.hashCode() + ": " + s.c); System.out.println("s2 = " + s2.next.hashCode() + ": " + s2.c); //s2.increment(); System.out.println("after s.increment, s2 = " + s2); } }
@Override protected Object clone() throws CloneNotSupportedException { Snake s = null; s = (Snake) super.clone(); if (s.next != null) s.next = (Snake) s.next.clone(); return s; }克隆原理
Object.clone()方法负责建立正确的存储容量(原对象的大小),并通过“按位复制”将二进制位从原始对象中复制到新对象的存储空间。所以克隆的第一步应该调用super.clone()方法,为后续的复制建立基础,最后在自己的重载方法中完成必要的操作,以最终完成克隆。