gpt4 book ai didi

java - 深层复制中 java.util.Date 的行为

转载 作者:行者123 更新时间:2023-12-02 01:44:39 27 4
gpt4 key购买 nike

我有 Windows 7 Professional 64 位操作系统,并且正在使用 JDK 7。

我有一个 Employee 类,它支持通过构造函数进行复制:

public class Employee {
private int id;
private String name;
private java.util.Date hireDate;

public Employee() {
}

public Employee(Employee e) {
this.id = e.id;
this.name = e.name;
this.hireDate = e.hireDate;
}

// getters and setters
}

为了首先测试,我创建了一个employee1对象:

Employee employee1 = new Employee();
employee1.setId(1);
employee1.setName("John");
employee1.setHireDate(new GregorianCalendar(2018, Calendar.DECEMBER, 19).getTime());

然后我将其克隆到employee2对象;

Employee employee2 = new Employee(employee1);

现在有人告诉我,只有基元和不可变对象(immutable对象)不需要深度复制,并且由于 java.util.Date 既不是基元也不是不可变的,所以我认为它将充当引用复制,因此如果我在一个对象中更改它,它也会在第二个对象中自动更改。

所以我在第二个对象中更改它:

employee2.setHireDate(new GregorianCalendar(2017, Calendar.FEBRUARY, 5).getTime())

但是当我将它们都打印出来时:

System.out.println("employee1.getHireDate()=" + employee1.getHireDate());
System.out.println("employee2.getHireDate()=" + employee2.getHireDate());

我看到了 2 个不同的日期。我理解错了什么?

最佳答案

尝试了解其内部原理。

Employee employee1 = new Employee();
employee1.setId(1);
employee1.setName("John");
employee1.setHireDate(new GregorianCalendar(2018, Calendar.DECEMBER, 19).getTime());

执行此操作时,您将获得一个员工对象 employee1,它具有一个引用 hireDate,该引用指向包含日期的 Date 对象(2018 年 12 月 19 日)。

现在,当你这样做时:

Employee employee2 = new Employee(employee1);

两个对象employee1employee2都有引用hireDate,它们指向包含日期的Date对象(19/12/2018)。

现在,了解这一点:

employee2.setHireDate(new GregorianCalendar(2017, Calendar.FEBRUARY, 5).getTime());

执行此操作时,将通过 new GregorianCalendar(2017, Calendar.FEBRUARY, 5).getTime() 创建一个新的 Date 对象,现在, employee2 对象的 HireDate 引用指向此 Date 对象。不是上一个。

这意味着对象 employee1hireDate 引用指向包含日期 (19/12/2018) 和 hireDate< 的 Date 对象 对象 employee2 的引用指向包含日期 (5/2/2017) 的 Date 对象。

这就是为什么您会得到不同的日期。希望这会有所帮助。

关于java - 深层复制中 java.util.Date 的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53861226/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com