Java中,如果是基本数据对象,比如整形、浮点型和布尔型数据类型的对象,那么无需克隆,赋值的时候自动生成了副本。
但是如果是对象数据类型,比如“Date”,那么就需要克隆技术中的深拷贝,否则将这个变量赋值给另外一个变量的结果就是两个变量引用了同一个对象。
而下面的
public tempClass clone() throws CloneNotSupportedException
方法中,我对“Date”变量没有克隆,直接赋值了。但是从修改了其中一个的时候,另外一个也没同时改变啊。最后的结果:
tempClass{a=1, a_date=Thu Feb 03 00:00:00 CST 1}
tempClass{a=1, a_date=Thu Feb 03 00:00:00 CST 1}(没有修改之前,对象和克隆对象都是1一样的)
tempClass{a=1, a_date=Sat Mar 04 00:00:00 CST 2}(修改了其中一个)
tempClass{a=1, a_date=Thu Feb 03 00:00:00 CST 1}(另外一个没有跟着改变?)
Process finished with exit code 0
import java.util.Date;
import java.util.GregorianCalendar;
import static java.lang.System.out;
public class temp {
public static void main(String[] args) throws CloneNotSupportedException {
var date = tempClass.g_date(1, 2, 3);
var date2 = tempClass.g_date(2, 3, 4);
var tempClass_obj = new tempClass(1, date);
var tempClass_obj_2 = tempClass_obj.clone();
out.println(tempClass_obj);
out.println(tempClass_obj_2);
tempClass_obj.setA_date(date2);
out.println(tempClass_obj);
out.println(tempClass_obj_2);
}
}
class tempClass implements Cloneable
{
private int a;
private Date a_date;
public tempClass(int a, Date a_date) {
this.a = a;
this.a_date = a_date;
}
public void setA_date(Date a_date) {
this.a_date = a_date;
}
public tempClass clone() throws CloneNotSupportedException
{
var cloned = (tempClass) super.clone();
// cloned.a_date = (Date) a_date.clone();
cloned.a_date = a_date;// 问题所在!!!
return cloned;
}
@Override
public String toString() {
return "tempClass{" +
"a=" + a +
", a_date=" + a_date +
'}';
}
public static Date g_date(int year, int month, int day)
{
Date date = new GregorianCalendar(year, month-1, day).getTime();
return date;
}
}