需要根据两个对象实现的类来比较它们吗?什么时候比较使用 getClass()
和什么时候 getClass().getName()
?这种比较两个对象类类型(名称)的方法之间有什么区别吗?
public abstract class Monster { ... }
public class MonsterTypeOne extends Monster { ... }
public class MonsterTypeTwo extends Monster { ... }
Monster monster = MonsterTypeOne();
Monster nextMonster = MonsterTypeTwo();
if(nextMonster.getClass().getName().equals(monster.getClass().getName()) )// #1
if(nextMonster.getClass().equals(monster.getClass()) )// #2
编辑 1
关于什么: ?
nextMonster.getClass().equals(MonsterTypeOne.class)
原文由 J.Olufsen 发布,翻译遵循 CC BY-SA 4.0 许可协议
是的。如果两个类由不同的
ClassLoader
加载,则它们可能具有相同的名称。“Java 类加载器的基础知识” 说
“Eclipse - 两个 VM(和许多类加载器)的故事” 说
如果你想知道两个对象是否属于同一类型,你应该使用
equals
方法来比较两个类——第一个选项。我无法想象你为什么要这样做,但如果你想知道具有不同具体类型的两个对象是否具有具有相同完全限定名称的类型,那么你可以使用第二个。如果您不理解 Java 上下文中的“具体类型”和“完全限定名称”,那么您就不是在为 Java 编写类型分析代码,所以您不想这样做。