官方解释如下:
instanceof | getClass() | |
---|---|---|
允许子类实例与父类相等 | 是 | 否 |
允许不同子类的示例相互相等 | 是 | 否 |
重写生成的 equals 方法不违反其约定 | 否 | 是 |
避免额外的空检查 | 是 | 否 |
遵守Liskov替换原则(LSP) | 是 | 否 |
注:Liskov替换原则(LSP)是一种面向对象编程的基本原则,它要求派生类(子类)对象能够替换其基类(父类)对象被使用,而程序逻辑不受影响。
要点如下:
① instanceof 表达式允许子类与父类对象进行比较,适用于希望支持多态性比较的场景,即允许子类对象与父类对象“相等”(如果子类没有增加新的字段,并且希望继承父类的相等性判断逻辑。如果子类添加了新的字段,并且没有重写equals()方法判断这些新字段,那么使用instanceof会导致判断不符合预期)。
② getClass()方法返回对象的运行类型。在equals()方法中使用getClass()比较表达式,实际上是比较两个对象的运行类型和对象是否完全相同。只有当两个对象属于同一个类且字段相同时,才认为它们相等。