2014-06-25 15 views
3

由於日期是在Java可變的,他們的getter setter方法直接優選的可變性與Java的getter和setter日期

public void setDate(Date date){ 
    this.date = date; 
} 

public Date getDate(){ 
    return this.date; 
} 

所以我寫了一篇關於Ideone代碼來驗證這一點,

/* package whatever; // don't place package name! */ 

import java.util.*; 
import java.lang.*; 
import java.io.*; 

/* Name of the class has to be "Main" only if the class is public. */ 
class Ideone 
{ 
    private class Test{ 
     private Date date; 

     public void setDate(Date date){ 
      this.date = date; 
     } 

     public Date getDate(){ 
      return this.date; 
     } 
    } 
    public static void main (String[] args) throws java.lang.Exception 
    { 
     Ideone abc = new Ideone(); 
     abc.functionTest(); 

    } 

    public void functionTest(){ 
     Date tempDate = new Date(1403685556000L); 
     Test test = new Test(); 
     test.setDate(tempDate); 
     tempDate = new Date(1435221556000L); 
     Date abc = test.getDate(); 
     Long def = abc.getTime(); 
     System.out.println("Date 1:"+def.toString()); 
     test.setDate(tempDate); 
     def = abc.getTime(); 
     System.out.println("Date 2:"+def.toString()); 
    } 
} 

我得到了以下結果作爲輸出

Date 1:1403685556000 
Date 2:1403685556000 

這些都是原來的日期,而不是改變一個。 這是結果與Java中的Date對象的Mutability的預期相反。

爲什麼我得到這個意想不到的行爲?

這裏是Ideone Code

+0

這裏有什麼問題嗎? – Keppil

+0

你的問題是什麼? – lpratlong

+1

是的,爲什麼我得到這個意外的行爲 – Dheerendra

回答

1

您正在爲tempDate = new Date(1435221556000L);(然後test.setDate(tempDate);)設置日期的新參考。

因此,您的「原始」日期並未更改,因爲它沒有指向新的參考。

Date tempDate = new Date(1403685556000L); // first reference. 
    Test test = new Test();     
    test.setDate(tempDate);      
    tempDate = new Date(1435221556000L);   // second reference. 
    Date abc = test.getDate();     // you take the first reference since you do not set "tempDate" in Test before. 
    Long def = abc.getTime(); 
    System.out.println("Date 1:"+def.toString()); // you print the first reference. 
    test.setDate(tempDate);      // you set the second reference and overwrite the first one. 
    def = abc.getTime();       // but "abc" still points on first reference. 
    System.out.println("Date 2:"+def.toString()); 

這是指針:對Date一審您abc變量點(由new Date(1403685556000L)聲明)。如果通過設置新實例更改Test.date的值,則abc仍將指向先前的指針。

,如果你改變使用Date實例方法Test.date值,你就不會改變Test.date的參考和你abc變量將反映這些變化。

+0

但第二次,在行test.setDate(tempDate)我引用tempDate Test.date,但def沒有更新在最後System.println – Dheerendra

+0

@Dheerendra我編輯我的答案給你更多的信息。 – lpratlong

1

你必須設置第二tempDate更高版本。

+0

我不想做+1,我不能刪除它現在。你的回答不完整。 – lpratlong