按类型或类名比较两个类

新手上路,请多包涵

需要根据两个对象实现的类来比较它们吗?什么时候比较使用 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 许可协议

阅读 502
2 个回答

这种比较两个对象类类型(名称)的方法之间有什么区别吗?

是的。如果两个类由不同的 ClassLoader 加载,则它们可能具有相同的名称。

“Java 类加载器的基础知识”

在最简单的情况下,类加载器创建一个由字符串名称引用的类主体的平面名称空间。

“Eclipse - 两个 VM(和许多类加载器)的故事”

这意味着可以同时将两个同名的类加载到 VM 中,前提是它们有两个独立的 ClassLoader


什么时候比较使用 getClass() 和什么时候 getClass().getName()

如果你想知道两个对象是否属于同一类型,你应该使用 equals 方法来比较两个类——第一个选项。

我无法想象你为什么要这样做,但如果你想知道具有不同具体类型的两个对象是否具有具有相同完全限定名称的类型,那么你可以使用第二个。如果您不理解 Java 上下文中的“具体类型”和“完全限定名称”,那么您就不是在为 Java 编写类型分析代码,所以您不想这样做。

原文由 Mike Samuel 发布,翻译遵循 CC BY-SA 3.0 许可协议

使用 class.equals()

 if (nextMonster.getClass().equals(monster.getClass()))

或者,因为每个类都像一个单例 - 每个类加载器的每个类只有一个实例,而大多数 JVM 只有一个类加载器 - 你甚至可以使用身份比较:

 if (nextMonster.getClass() == monster.getClass())

原文由 Bohemian 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏