平等应该是对称的,对吧?
Object someObject = new Object();
Object NULL = null;
NULL.equals(someObject) => NullPointerException
someObject.equals(NULL) => false
不让第二种形式抛出 a的理由是NullPointerException
什么?
平等应该是对称的,对吧?
Object someObject = new Object();
Object NULL = null;
NULL.equals(someObject) => NullPointerException
someObject.equals(NULL) => false
不让第二种形式抛出 a的理由是NullPointerException
什么?
在第一种情况下,equals() 方法不会抛出 NPE,因此您不能提出该论点。对称性是 equals() 方法契约的一部分。
在理论上,平等当然被定义为对称的,但它也根本没有在不存在的对象上定义(这就是 null 所代表的)。
因此,应用于 null 的任何行为都将同样有效。它可以返回一只活兔子,但仍然不与平等的理论定义相矛盾。
在这种情况下,代表 Java 设计者的一个非常合理的实现决定是,对 null 值调用 equals 应该抛出 NullPointerException,因为这与在 null 值上调用任何其他方法是一致的。
null
因为在第二种情况下您没有访问对象的方法。不平衡的不是平等的概念,而是您访问它的方式。
第二个示例不是对称示例,因为它违反了关于 Object 和equals() 方法的简单规则之一:
对于任何非空引用值 x,x.equals(null) 应该返回 false。
我会去
someObject.equals(null);
不让第二种形式抛出 NullPointerException 的原因是什么?
在这种情况下,它不会抛出 NullPointerException。
在这里,我们确定equals()
要调用的对象是NOT NULL
.
第二位不会引发 NPE,因为您没有取消引用空指针。该代码返回 false,因为您正在将值与非值进行比较。
equals(null)
将始终返回 false,因为没有空值之类的东西。null
因为 Java 中不存在这个概念,所以 Object 和 Primitive 都不能有这个值。null
是一个表示空引用的文字,这就是我们比较引用的原因,例如if (obj == null)
. 请参阅 Java 语言规范,第 3.10.7 节。换句话说,您将 的值与someObject
空引用进行比较。
您可以创建自己的对象,覆盖equals
并返回 true,但这会违反 Object.xml 中的定义。