2013-06-30 56 views
0

我將一個實例變量添加到類「Person」,它是一個引用類型(「Date」,我寫了一個類)。在我的Person類的構造函數中,我因此試圖使用Date類的構造函數初始化Date屬性,但我不確定如何執行此操作。以前我只能初始化原始類型(或字符串),如下所示。這是我的代碼段。我不確定如何初始化「生日」,以便它使用Date類的構造函數。謝謝!如何在Java中構造函數中初始化引用屬性?

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 = ???? 

回答

1

你是說你想使用Date構造函數在Person的構造函數中初始化this.birthday?然後使用new關鍵字如下:

this.birthday = new Date(<arguments if any exist>); 

new調用對象的構造函數。如果是這樣的話,那麼Person不需要Date birthday構造函數參數,除非您將其用於別的東西。

+0

我想這樣做,但我很困惑。以firstName變量爲例。在構造函數中,我們有「this.firstName = firstName;」,它基本上給出firstName屬性(這是早先聲明的)作爲參數輸入的值(「firstName」參數),不是嗎?所以如果我寫this.birthday = new Date();那麼爲生日輸入的參數如何傳遞給它? –

+0

那麼'this.birthday = birthday;'就是你要找的東西。它和你的例子'this.firstName = firstName;'的工作方式相同,生日對象將'指向'與參數傳遞的對象相同的對象。不過要注意的是,就像Joni下面所說的,如果某件事改變了生日的參數,它會改變班級的生日,反之亦然。 – Dynomyte

+0

好吧我想我明白了。我像你最初建議的那樣寫它,並根據我的默認Date參數正確創建Date對象。但是我還需要在我的Person代碼中添加另一個構造函數,這將允許我創建一個指向在新Person中傳遞的參數的「生日」。你說'this.birthday = birthday;'我知道會工作,除了'birthday'由三個參數組成:'int year,int month,int day'。那麼如何設置一個允許Person接受'int year,int month,int day'並將其賦值給'birthday'的構造函數呢? –

1

你可以這樣做:

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

這將創建日期對象的副本。由於日期可以修改它是危險的,使用相同的對象,而如果你只是複製的參考,你會做:

this.birthday = birthday; 

這將使外界改變你的生日,你不知道關於它。

0

你可以簡單

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

爲什麼這樣的呢?

this.birthday = birthday;

原因外人可以修改你的約會對象,然後將它們修改你的內部結構,這是不好的,打破封裝。

爲什麼用這種方式代替?

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

日期不是最終類,如果你通過Date object不是「真正的日期」,是一個,如果你這樣做不保留的子類的內部結構發生什麼,但是當你克隆保留信息,但這種方式取決於你想要的東西。

相關問題