按类型或类名比较两个类

J.O*_*sen 30 java oop

需要根据它们实现的类来比较两个对象吗?何时比较使用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
Run Code Online (Sandbox Code Playgroud)

编辑1


关于什么: ?

nextMonster.getClass().equals(MonsterTypeOne.class)
Run Code Online (Sandbox Code Playgroud)

Boh*_*ian 33

用途class.equals():

if (nextMonster.getClass().equals(monster.getClass()))
Run Code Online (Sandbox Code Playgroud)

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

if (nextMonster.getClass() == monster.getClass())
Run Code Online (Sandbox Code Playgroud)


Mik*_*uel 20

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

是.如果两个类由不同的ClassLoaders 加载,则它们可以具有相同的名称.

"Java类加载器的基础知识"

最简单的是,类加载器创建一个由字符串名称引用的类主体的平面名称空间.

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

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


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

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

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