AdvanceY 2021-07-03 20:17 采纳率: 57.1%
浏览 48
已采纳

关于Java中克隆的一个简单问题

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;
    }
}
  • 写回答

2条回答 默认 最新

  • _Mr.Tree 2021-07-03 22:50
    关注

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 在若依框架下实现人脸识别
  • ¥15 网络科学导论,网络控制
  • ¥100 安卓tv程序连接SQLSERVER2008问题
  • ¥15 利用Sentinel-2和Landsat8做一个水库的长时序NDVI的对比,为什么Snetinel-2计算的结果最小值特别小,而Lansat8就很平均
  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同