我正在努力理解这个Koan:
@Koan
public void equalsMethodCanBeChangedBySubclassesToTestsIfTwoObjectsAreEqual() {
Object object = new Integer(1);
assertEquals(object.equals(object), true);
assertEquals(object.equals(new Integer(1)), __);
// Note: This means that for the class 'Object' there is no difference between 'equal' and 'same'
// but for the class 'Integer' there is difference - see below
}
Run Code Online (Sandbox Code Playgroud)
据我所知,因为object是Object类的一个实例,该.equals()方法尚未被覆盖,因此检查对象是否相等.
如果new Integer(1)创建一个新实例,那么它应该是一个单独的对象object.按照我的思路,正确的答案应该是false,但只有true通过.我逻辑中的缺陷在哪里?
编辑:我知道-128和127之间的整数是缓存的.如果我对该object对象的理解是正确的(如上所述),那么这是无关紧要的.
整数覆盖equals并检查底层int是否等于int另一个Integer实例,如果是,则返回true.equals调用Integer的方法而不是Object 的方法的原因是运行时类型object是Integer.
Integer是一个Object,但由于被覆盖equals,因此不使用对象标识.
以下所有布尔表达式的计算结果为true:
print((new Integer(1).equals(1)));
print((new Integer(1).equals(new Integer(1))));
print((((Integer) 1).equals(new Integer(1))));
print(((Integer) 1).equals(1));
Run Code Online (Sandbox Code Playgroud)
现在考虑自动装箱,它重用[-128,127]范围内的值的实例.以下关于对象相等性的陈述都在评估true:
1 == ((Integer) 1)
((Integer) (-128)) == ((Integer) (-128)) // in autoboxing range
((Integer) (+127)) == ((Integer) (+127)) // same
((Integer) (-200)) != ((Integer) (-200)) // not autoboxing
((Integer) (+200)) != ((Integer) (+200)) // same
((Integer) (-128)) != (new Integer(-128)) // explicit new instance, so no autoboxing
((Integer) (+127)) != (new Integer(+127)) // same
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
412 次 |
| 最近记录: |