我是Java编程的初学者。目前,我正在this页面阅读有关继承和等于方法的内容。 在此之前我理解这些解释:
比较this和otherObject的类。如果是语义 equals可以在子类中更改,使用 getClass test:
if (getClass() != otherObject.getClass()) return false;
如果所有子类都使用相同的语义,则可以使用 instanceof 测试:
if (!(otherObject instanceof ClassName)) return false;
我不明白“等于”的语义是什么'意思。有人可以共享我们使用getClass()和instanceof的场景吗?
感谢您的阅读。
答案 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的实例的情况下,使用方法实例。它返回布尔值。
希望这能解答您的疑问:)