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 cs loadimage运行不了,easyx也下了,没有用
  • ¥15 r包runway详细安装教程
  • ¥15 Html中读取Json文件中数据并制作表格
  • ¥15 谁有RH342练习环境
  • ¥15 STM32F407 DMA中断问题
  • ¥15 uniapp连接阿里云无法发布消息和订阅
  • ¥25 麦当劳点餐系统代码纠错
  • ¥15 轮班监督委员会问题。
  • ¥20 关于变压器的具体案例分析