2016-07-17 103 views
2
class Date { 
    private int year; 
    private String month; 
    private int day; 

    public Date() { 
     month = "January"; 
     year = 1999; 
     day = 1; 
    }         //End of Constructor 1 

    public Date(int year, String month, int day) { 
     setDate(year, month, day); 
    }         //End of Constructor 2 

    public Date(int year) { 
     setDate(year, "January", 1); 
    }         //End of Constructor 3 

    public void setDate(int year, String month, int day) { 
     this.year = year; 
     this.month = month; 
     this.day = day; 
    }        //End of Constructor 4 
} 

public class Calendar { 
    public static void main(String[] args){  
     Date date1 = new Date(2009, "March", 3); 
     Date date2 = new Date(2010); 
     Date date3 = new Date(); 
    } 
} 

在上面的代碼中,爲date1,date2和date3調用哪個構造函數?在構造函數被調用後,如何打印date1,date2和date3的結果?Java初學者對構造函數的使用感到困惑

我試圖System.out.println(date1)等,但它給了我奇怪的串像[email protected]

我期待看到2009年3月1日或什麼之類的。

+0

1)你不應該影響內置的Java Date類... 2)你沒有第四個構造函數...這是一個你調用的方法...'new Date()。setDate(0,「test」,0)' –

回答

2

當您嘗試打印對象時,將調用其toString()方法,該方法被所有 java類從Object class(默認情況下爲所有java類的超類)繼承。因此,如果您需要打印對象的某些特定內容,則必須在類 中覆蓋toString()方法。默認情況下,此方法打印 Class and its hash code。由於您未覆蓋toString(),因此打印的字符串 包含對象類及其哈希碼([email protected] ....)。 您的構造函數調用是由您傳遞給構造函數的參數決定的。 與date1一樣,您按順序通過了類型爲int,string and int的3個參數。 這匹配您的構造函數2參數是int, string and int。 因此在你的date1對象構造中,調用構造函數2。 與date2類似,構造函數3被稱爲 ,對於date3,默認構造函數,即consturcot 1被調用。

的「構造4」您標記不是構造函數,它是一個簡單的方法。 構造函數沒有返回類型。

此外,打印爲你在你的問題預計,覆蓋類toString()方法,並在方法相應格式化結果得到預期的結果。

0

DATE1,DATE2,DATE3是一類日期的對象,並因此不能被打印。要打印它,你必須重寫toString()方法。

String toString() { 

return year + " " + month + " " + day; 

} 

此外, 構造用於初始化只的字段。

public void setDate(int year, String month, int day) { 
    this.year = year; 
    this.month = month; 
    this.day = day; 
}        //End of Constructor 4 

這種方法是不是構造函數,因爲構造函數總是有相同的名稱,類別,並沒有明確的返回類型。

+0

你能否解釋第四種方法沒有返回類型以及這個.___的功能是什麼? – Wells

+1

我說它不是一個構造函數,因爲它沒有類的名稱並且具有void返回類型。 –

+0

構造函數用於初始化類的實例。字段是其中的一部分,但這不是構造函數的唯一功能。 –

0

,你只需要叫構造函數的參數與定義的構造函數匹配,如果你沒有定義任何參數,那麼默認的構造函數會像

日期日期1 =新的日期(2009年被調用,「三月」,3 );它會調用

public Date(int year, String month, int day) { 
     setDate(year, month, day); 
    }         //End of Constructor 2 

Date date3 = new Date();將調用

Public Date() { 
     month = "January"; 
     year = 1999; 
     day = 1; 
    }         //End of Constructor 1 

Date date2 = new Date(2010);它會調用

public Date(int year) { 
    setDate(year, "January", 1); 
}         //End of Constructor 3 
+0

您的意思是「如果您沒有定義任何構造函數,那麼將會提供默認構造函數」?在OP的示例中,顯式定義了構造函數,因此不提供默認構造函數。 –

+0

是的,沒有構造器對象無法創建。如果你沒有定義任何構造函數,那麼編譯器會提供一個默認的構造函數......! – Shailesh