Java equals() 方法 - “子类中的相等语义”如何确定 getClass 和 instanceof 的使用

yog*_*cak 5 java inheritance equals

我是 Java 编程的初学者。目前我正在阅读有关继承和equals方法这个页面。我理解的解释直到这一点:

比较 this 和 otherObject 的类。如果子类中 equals 的语义可以改变,请使用getClass测试:

if (getClass() != otherObject.getClass()) return false;
Run Code Online (Sandbox Code Playgroud)

如果所有子类都具有相同的语义,则可以使用instanceof测试:

if (!(otherObject instanceof ClassName)) return false;
Run Code Online (Sandbox Code Playgroud)

我不明白“平等的语义”是什么意思。有人可以分享我们使用 getClass() 和 instanceof 的场景吗?

感谢您的阅读。

小智 3

简单地说,getClass() 返回对象的直接类。例如,

class A { }

class B extends A { }
Run Code Online (Sandbox Code Playgroud)

如果我们从 A 和 B 创建两个对象,

A objA = new A();
B objB = new B();
Run Code Online (Sandbox Code Playgroud)

现在我们可以检查 getClass 是如何工作的

System.out.println(objA.getClass()); //Prints "class A"
System.out.println(objB.getClass()); //Prints "class B"
Run Code Online (Sandbox Code Playgroud)

所以,

objA.getClass() == objB.getClass()
Run Code Online (Sandbox Code Playgroud)

返回假。但

System.out.println(objB instanceof A); //Prints true
Run Code Online (Sandbox Code Playgroud)

这是因为即使给出了所提供对象的超类,instanceof也会返回true。

因此,当您设计 equals() 方法时,如果您想检查给定对象(otherObject)是否从同一个直接类实例化,请使用

 if (getClass() != otherObject.getClass()) return false;
Run Code Online (Sandbox Code Playgroud)

如果给定的对象(otherObject)甚至可以从您提供的类(ClassName)的子类中创建,请使用

if (!(otherObject instanceof ClassName)) return false;
Run Code Online (Sandbox Code Playgroud)

简单地说,“equals 的语义”意味着“您期望 equals() 方法达到的目的”。所以你可以根据你的需要使用合适的方法。