Java中的Clone
概述
clone,顾名思义,就是复制克隆的意思,我们可以通过clone()方法,来获得一个相同的对象。
实现
如果我们自定义的类要可以被复制,那么类必须实现Cloneable中接clone()方法。
1 2 3 4 5 6 7 8 9 10 11 12 13
| public class Main{ public static void main(String... args){ Test t1 = new Test(); Test t2 = t1.clone(); } } class Test implements Cloneable{ public Test(){} @Override public Object clone() throws CloneNotSupportedException{ return super.clone(); } }
|
深克隆与浅克隆
但是呢,在java中,我们知道有一些对象是存放在栈区,一些是存放在堆中的,存放在堆中的对象,一般都是由一个在栈中的变量指向它的。
那么,当我们在调用clone()方法的时候,是在复制对象呢,还是复制它的引用呢?
假如我们把上面的代码修改一下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| public class Main{ public static void main(String... args) throws Exception{ Test t1 = new Test(); Test t2 = (Test)t1.clone(); System.out.println("t1 == t2 ? " + (t1.b == t2.b)); } } class Test implements Cloneable{ public int a; public String b; public Test(int a, String b){ this.a = a; this.b = b; } @Override public Object clone() throws CloneNotSupportedException{ return super.clone(); } }
|
运行之后,结果是true,也就是说t1跟t2中的String对象b都是同一个。
而这是为什么呢