2011-12-21 82 views
0

我將創建一個時鐘,顯示軍事和正常時間在兩個不同的類和時間聲明爲objects.That完成但現在我需要將clock類延伸到 其中有setAMPM(boolean yes)方法的AMPMclock。如果setAMPM(true)它將顯示軍事時間,如果它是假的,它將顯示正常時間。我創建setAMPM方法返回一個布爾值並在其他方法和對象中使用它

class AMPMclock extends clock 
{ 
    boolean setAMPM(boolean yes) 
    { 
     return yes; 
    } 
} 

class clock 
{ 
    private int hours; 
    private int minutes; 
    private int seconds; 
private boolean yes; 

    setMin.... 

    setHour... 

    setSec.... 

    tick() ///moves the clock 1sec 


    public String toString() 
    { 

     if(yes) return String.format("%d:%02d:%02d %s", (hours == 12 || hours == 0)?12 : hours%12, minutes, seconds, (hours < 12)? "AM" : "PM"); 
     else return String.format("%02d:%02d:%02d",hours,minutes,seconds); 
    //else 
    } 

}


MAIN

AMPMclock clockObject = new AMPMclock(); 

clockObject.setHour(16); 
clockObject.setMin(28); 
clockObject.setSec(58); 



    System.out.println(clockObject.toString()); 
    clockObject.tick(); 
    clockObject.setAMPM(false); 
    System.out.println(clockObject.toString()); 

    clockObject.tick(); 
    clockObject.setAMPM(true); 
    System.out.println(clockObject.toString()); 
    clockObject.tick(); 
    System.out.println(clockObject.toString()); 

然而磨我使用clockObject.setAMPM(true)clockObject.setAMPM(false) 是的布爾值不會改變,所以我可以在另一種方法中使用它。它始終保持不變...有任何幫助? TNX

+1

你的問題完全不清楚。請添加一些代碼,說明您遇到的問題。 – 2011-12-21 21:37:49

+0

這段代碼傷害了我的眼睛。 – 2011-12-21 22:45:02

回答

2

如果保存例如設置在AMPM實例變量,那麼你就需要像:

boolean ampm = true; 

boolean setAMPM(boolean yes) 
{ 
    ampm = yes; 
    return yes; 
} 
3

setter的想法是封裝專用實例變量。您只是簡單地返回參數而不修改類的內部狀態,這就是爲什麼在代碼中沒有「粘」的原因。

class Clock { 

    private boolean useAMPM; 

    public void setAMPM(boolean useAMPM) { 
     this.useAMPM = useAMPM; 
    } 

    public boolean isAMPM() { 
     return this.useAMPM; 
    } 
} 
+1

只是爲了適應Java Bean標準,getter應該是'isAMPM()'。 – Marcelo 2011-12-21 21:42:37

+0

好的,但我需要使用useAMPM以及「時鐘」類。 我聲明「私有布爾useAMPM;」但即使延長時鐘也不能識別。 – 2011-12-21 22:31:34

+0

@StefanosVarsanis,如果AMPM只與子類相關,我會試圖讓它只是一個子類的實現細節,如果需要的話可能會覆蓋ToString。否則,您需要將該變量放在超類中並打開它,可能使用'protected'關鍵字而不是'private',以便子類可以看到它。缺點是同一個軟件包中的任何一個類都可以看到它。您必須評估每種方法,以查看最適合您需求的方法。 – 2011-12-22 00:13:47

0

可能您需要遵循java bean約定嗎?

這是你想達到的目標嗎?

public class AMPMClock { 

    private boolean isAMPM; 

    public void setAMPM(boolean ampmFlag){ 
    this.isAMPM = ampmFlag; 
    } 
    public boolean isAMPM(){ 
    return this.isAMPM; 
    } 

} 
0

你可能需要存儲在一個成員變量...

private boolean useAMPM = false; 
    public boolean setAMPM (final boolean wantAMPM) { 
      useAMPM = wantAMPM; 
      return useAMPM; 
    } 
    public void draw() { 
      … 
      if (useAMPM) { /* … */ } else { /* … */ } 
    } 

在方法的lambda列表中的變量(即您可以指定,當你定義一個方法,像wantAMPM/yes)被分配當函數被調用時,函數返回時被銷燬。 (由於各種原因,宣佈它們全部爲final也是一種好習慣。)事實上,您也可以在Java程序中幾乎任意一對{ braces }內創建自動變量,這些變量同樣會在您到達}區塊的末尾。

成員變量(屬性)在發現它們的對象實例的生命週期中保持不變。所以,當例如你說Clock clockInstance = new Clock();,然後clock.useAMPM將被創建,並且繼續存在,直到clockInstance被銷燬。

相關問題