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

时间:2017-05-11 04:17:52

标签: java inheritance equals

我是Java编程的初学者。目前,我正在this页面阅读有关继承和等于方法的内容。 在此之前我理解这些解释:

  

比较this和otherObject的类。如果是语义   equals可以在子类中更改,使用 getClass test:

if (getClass() != otherObject.getClass()) return false;
  

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

if (!(otherObject instanceof ClassName)) return false;

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

感谢您的阅读。

2 个答案:

答案 0 :(得分:3)

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

class A { }

class B extends A { }

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

A objA = new A();
B objB = new B();

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

System.out.println(objA.getClass()); //Prints "class A"
System.out.println(objB.getClass()); //Prints "class B"

所以,

objA.getClass() == objB.getClass()

返回false。但

System.out.println(objB instanceof A); //Prints true

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

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

 if (getClass() != otherObject.getClass()) return false;

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

if (!(otherObject instanceof ClassName)) return false;

简单地说,"等于"的语义意味着"你期望从equals()方法"的目的。因此,您可以根据需要使用适当的方法。

答案 1 :(得分:2)

  

更改equals的语义

这意味着可以在子类中覆盖equals方法,在这种情况下使用getClass来检查对象是否属于同一个类。

  

通常,getClass vs

的实例

当我们需要知道特定对象的类时,我们使用getClass。考虑具有线性链继承的情况,如下所示:

MainClass - > SubClassLevel1 - > SubClassLevel2

并初始化为

MainClass mc = new SubClassLevel2();

这里要知道层次结构中的哪个类是我们对象的类。

现在,在必须仅检查x是否是类Y的实例的情况下,使用方法实例。它返回布尔值。

希望这能解答您的疑问:)