clone() 方法(浅拷贝或深拷贝)
clone() method (Shallow or Deep copying)
在 java 书籍和在线教程中指出 Object.clone()
方法提供浅拷贝,除非使用 Cloneable 接口但在代码中我实现了 clone()
方法而不使用 Cloneable
接口,它提供深拷贝而不是浅拷贝。
import java.util.GregorianCalendar;
public class test1 {
public static void main(String[] args) {
// create a gregorian calendar, which is an object
GregorianCalendar cal = new GregorianCalendar();
// clone object cal into object y
GregorianCalendar y = (GregorianCalendar) cal.clone();
// check if reference of y is equal to cal or not
System.out.println(cal==y);//it's output should be true if this is a shallow copy but it is false.
}
}
GregorianCalendar
确实实现了 Cloneable
接口,所以它应该进行深度复制。
编辑:Java 仅处理对对象的引用。因此,在这种情况下,由于 GregorianCalendar
的 clone
方法执行深度复制,复制引用的一种方法是将 cal
分配给 y
,即 y = cal
.
在 java 书籍和在线教程中指出 Object.clone()
方法提供浅拷贝,除非使用 Cloneable 接口但在代码中我实现了 clone()
方法而不使用 Cloneable
接口,它提供深拷贝而不是浅拷贝。
import java.util.GregorianCalendar;
public class test1 {
public static void main(String[] args) {
// create a gregorian calendar, which is an object
GregorianCalendar cal = new GregorianCalendar();
// clone object cal into object y
GregorianCalendar y = (GregorianCalendar) cal.clone();
// check if reference of y is equal to cal or not
System.out.println(cal==y);//it's output should be true if this is a shallow copy but it is false.
}
}
GregorianCalendar
确实实现了 Cloneable
接口,所以它应该进行深度复制。
编辑:Java 仅处理对对象的引用。因此,在这种情况下,由于 GregorianCalendar
的 clone
方法执行深度复制,复制引用的一种方法是将 cal
分配给 y
,即 y = cal
.