按类型或类名比较两个类

2022-09-01 06:43:18

有必要根据两个对象实现的类来比较它们吗?何时比较使用和何时使用?这种比较两个对象类类型(名称)的方法之间有什么区别吗?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)

答案 1

用:class.equals()

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

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

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

答案 2

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

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

“Java类装入器的基础知识”

最简单的是,类装入器创建由字符串名称引用的类体的平面名称空间。

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

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


何时比较使用和何时使用?getClass()getClass().getName()

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

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