Java 为什么这两种比较类对象的方法会产生不同的结果?

Java 为什么这两种比较类对象的方法会产生不同的结果?,java,java.lang.class,Java,Java.lang.class,我定义了两类:雇员和医生,他们是父亲和儿子。代码如下所示: class员工{ // .... } 班级医生延伸员工{ // .... } 然后我写了一个主要方法如下: publicstaticvoidmain(字符串[]args){ 医生=新医生(); 员工=新员工(); System.out.println(doctor.getClass()==newemployee().getClass());//代码1 System.out.println(employee.getClass()==em

我定义了两类:雇员和医生,他们是父亲和儿子。代码如下所示:

class员工{
// ....
}
班级医生延伸员工{
// ....
}
然后我写了一个主要方法如下:

publicstaticvoidmain(字符串[]args){
医生=新医生();
员工=新员工();
System.out.println(doctor.getClass()==newemployee().getClass());//代码1
System.out.println(employee.getClass()==employee.class);//代码2
System.out.println(doctor.getClass()==Employee.class);//代码3
}
但只有
code 1
code 2
是正确的,
code 3
调用异常:

错误:(33,46)Java:uncomplaborable类型:Java.lang.Class和Java.lang.Class

我知道我可以使用
equals
来处理这个问题,但是我想知道为什么我不能使用操作符
=
来比较它们。

您观察到的行为是正确的,但是为了解释原因,我们需要参考Java语言规范

C.class
的类型是
class
,其中
C
是类、接口或数组类型(§4.3)的名称

说:


getClass
的方法调用表达式的类型是
ClassMaybe try
。equals
Class
对象在每个类中都是唯一的,只要您使用相同的类加载器,因此通过
=
比较它们通常是正确的。本例中的错误是因为比较永远不可能为真,而编译器之所以这样告诉您,是因为您可能不想检查一个永远不可能为真的条件。
doctor
变量不能仅包含
Person
(或
Employee
)的实例-它必须是
Doctor
或其任何子类的实例-这样比较是无用的,编译器试图帮助避免这种情况(这是编译错误,不是
异常
{除非运行未正确编译的代码}),没有问题;我已经修改过了。非常感谢你的详细回答,我已经理解了原因!!