如何在Java中的构造函数中初始化引用属性?

我正在将一个实例变量添加到类“Person”中,这是一个引用类型(“Date”,我为其编写了一个类)。 在我的Person类的构造函数中,我因此尝试使用Date类的构造函数初始化Date属性,但我不确定如何执行此操作。 以前我只初始化了原始类型(或字符串),如下所示。 这是我的代码中的一部分。 我不确定如何初始化“生日”,以便它使用Date类的构造函数。 谢谢!

public class Person { /* Attribute declarations */ private String lastName; // last name private String firstName; // first name private String email; // email address private Date birthday; // birth date /** * Constructor initializes the person's name, email address, and birthday */ public Person(String firstName, String lastName, String email, Date birthday) { this.firstName = firstName; this.lastName = lastName; this.email = email; this.birthday = ???? 

你是说你想使用Date构造函数在Person的构造函数中初始化this.birthday ? 然后像这样使用new关键字:

 this.birthday = new Date(); 

new调用对象的构造函数。 如果是这种情况,您不需要Person的Date birthday构造函数参数,除非您将其用于其他内容。

你可以这样做:

 this.birthday = new Date(birthday.getTime()); 

这将创建日期对象的副本。 由于可以修改日期,因此使用相同的对象是很危险的,如果您刚刚复制了引用,那么您将要执行此操作:

 this.birthday = birthday; 

这将允许外面的世界在你不知道的情况下改变你的生日。

你可以很简单

this.birthday = (Date) birthday.clone();

为什么这样而不是?

this.birthday = birthday;

外人可以修改你的日期对象,然后他们正在修改你的内部结构,这是不好的,打破封装。

为什么这样而不是?

this.birthday = new Date(birthday.getTime()) ;

如果你传递的Date object不是“true Date”并且是子类 ,则日期不是最终类会发生什么?如果这样做不保留子类的内部结构,但是当你克隆时保留信息,但这种方法呢取决于你想要什么。