2013-05-05 39 views
0

我有一個問題。 我創建了數字接口,並且我在接口中創建了靜態最終對象。如果我修改對象並檢查相等性,則返回true。我重寫了'等號',問題沒有改變。java界面靜態最終對象相等錯誤

下面是代碼:

public interface Numeric<T extends Number> extends Cloneable, Comparable<T> { 

    public static final Numeric<Short> SHORT = new Numeric<Short>() { 

      private short value = (short) 0; 

      @override 
      public Numeric<Short> add(Short value) { 
           this.value += value; 
           return this; 
      } 

      @override 
      public Short value() { 
        return value; 
      } 
    } 

    public Numeric<T> add(T value); 

    public T value(); 

    //.... 
} 

public class Test { 
    public static void main(String[] args) { 
     Numeric<Short> one = Numeric.SHORT; 
     Numeric<Short> two = Numeric.SHORT; 
     one.add(Short.MIN_VALUE); 
     System.out.println(two.value()); //print -32768!!!!! why not 0? 
    } 
} 

謝謝回答!

回答

0

onetwo指的是同一個對象(Numeric.SHORT)。當您將Short.MIN_VALUE(等於-32768)添加到one時,您還將它添加到two,因爲它們是相同的對象。

如果您希望two不受one更改的影響,那麼您必須爲每個作業複製Numeric.SHORT

0

這是因爲你的SHORT是靜態的,它被視爲與單例相同。指配onetwo都指向相同的參考。

由於您將shorts min值添加到「one」,所以它實際上也修改了兩個點的單身人士。

0

您已經聲明SHORTstatic,這意味着共享副本

當你說

Numeric<Short> one = Numeric.SHORT; 
    Numeric<Short> two = Numeric.SHORT; 

參考onetwo基本上指向相同的對象SHORT。現在one.add(Short.MIN_VALUE);更改了SHORT的值,這仍然指向two,因此打印的值爲Short.MIN_VALUE,即-32768

0

您已定義名爲SHORTstatic Numeric<Short>

static意味着在您的Numeric接口的所有實現中共享一個實例。每次你參考Numeric.SHORT你都指向同一個實例。

one指的是Numeric.SHORTtwo指的是相同的Numeric.SHORT

當您撥打one.add(Short.MIN_VALUE);時,Numeric.SHORT.value的值現在爲Short.MIN_VALUE

然後調用two.value()以來two相同Numeric.SHORT例如,它會返回Short.MIN_VALUE這是-32768