2016-05-17 45 views
0

所以,我正在製作一個全屏應用程序,並且遇到了一些奇怪的事情。DisplayMode.equals(DisplayMode dm)Confusion

方法DisplayMode.equals(DisplayMode dm)被覆蓋,但我不認爲它的執行很正確。下面的代碼打印假到控制檯:

public static void main(String[] args){ 
    DisplayMode mode = new (1,2,16, DisplayMode.REFRESH_RATE_UNKNOWN); 
    System.out.println(mode.equals(new DisplayMode(1, 2, 16, 60))); 
} 

如果顯示模式是相同的,只留下他們的刷新率,其中之一是未知的,那麼我想他們應該是平等的。爲什麼不是這樣,有人可以建議我使用的解決方法?另外,爲什麼在線Java Docs顯示有兩個.equals()方法的重載版本,一個是DisplayMode對象,另一個是Java.Lang.Object對象? https://docs.oracle.com/javase/7/docs/api/java/awt/DisplayMode.html

回答

0

我相信的區別是,在第一種情況下,你說「我知道刷新率未知的事實」,在第二種情況下,你說「我知道事實:刷新率是60「。

grepcode實現顯示以下內容:

public boolean equals(DisplayMode dm) { 
    if (dm == null) { 
     return false; 
    } 
    return (getHeight() == dm.getHeight() 
     && getWidth() == dm.getWidth() 
     && getBitDepth() == dm.getBitDepth() 
     && getRefreshRate() == dm.getRefreshRate()); 
} 

,你可以看到它在底部的刷新率的值進行比較。

java.awt.DisplayMode#REFRESH_RATE_UNKNOWN定義爲0

至於第二個問題,關於爲什麼超載的方法,它允許代碼分離並只關注它所關心的部分。例如,如果不超載,該equals方法看起來就像

public boolean equals(Object obj) { 
    if (obj == null) { 
     return false; 
    } 

    if (obj instanceof DisplayMode) { 
     DisplayMode dm = (DisplayMode) obj; 

     return (getHeight() == dm.getHeight() 
      && getWidth() == dm.getWidth() 
      && getBitDepth() == dm.getBitDepth() 
      && getRefreshRate() == dm.getRefreshRate()); 
    } 

    return false; 
} 
+0

爲什麼有.equals()方法重寫此對象,而不是許多許多其他對象的Java庫? –

+0

@AviCaspe我不知道答案。這可能會影響性能。在編譯時,編譯器能夠判斷在這種情況下要調用哪個確切的方法;所以如果你想比較兩個'DisplayMode'對象,你可以通過調用一個以'DisplayMode'作爲參數的指令來保存一些指令,而不是採用'Object'的指令。另外需要考慮的是添加這個類時註釋不存在,所以你不能使用'@ Override',這可能與它有關。 – Zymus