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条)

报告相同问题?

悬赏问题

  • ¥88 实在没有想法,需要个思路
  • ¥15 MATLAB报错输入参数太多
  • ¥15 python中合并修改日期相同的CSV文件并按照修改日期的名字命名文件
  • ¥15 有赏,i卡绘世画不出
  • ¥15 如何用stata画出文献中常见的安慰剂检验图
  • ¥15 c语言链表结构体数据插入
  • ¥40 使用MATLAB解答线性代数问题
  • ¥15 COCOS的问题COCOS的问题
  • ¥15 FPGA-SRIO初始化失败
  • ¥15 MapReduce实现倒排索引失败