0

我有个问题。我正在创建数字接口,我正在接口中创建静态最终对象。如果我修改对象并检查相等性,则返回 true。我覆盖了“等于”,问题没有改变。

这是代码:

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?
   }
}

谢谢解答!

4

4 回答 4

0

这是因为你SHORT是静态的,它被视为与单例相同。两个赋值onetwo指向同一个引用。

由于您将短裤最小值添加到“一”,它实际上也修改了单例,这两个点也是如此。

于 2013-05-05T16:23:17.070 回答
0

onetwo引用同一个对象 ( Numeric.SHORT)。当您将Short.MIN_VALUE(等于-32768)添加到 时one,您也将其添加到two,因为它们是同一个对象。

如果您希望two不受更改的影响one,则必须Numeric.SHORT为每个作业制作一份副本。

于 2013-05-05T16:23:19.153 回答
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打印的值。

于 2013-05-05T16:23:49.843 回答
0

您已经定义了一个static Numeric<Short>被调用的SHORT.

static意味着在您的Numeric接口的所有实现之间共享一个实例。每次你提到Numeric.SHORT你指的是同一个实例。

oneNumeric.SHORTtwo指相同Numeric.SHORT

当您调用时one.add(Short.MIN_VALUE);的值为Numeric.SHORT.valuenow Short.MIN_VALUE

然后你打电话two.value(),因为two是同一个Numeric.SHORT实例,它会返回Short.MIN_VALUE-32768

于 2013-05-05T16:26:23.947 回答