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
或其任何子类的实例-这样比较是无用的,编译器试图帮助避免这种情况(这是编译错误,不是异常
{除非运行未正确编译的代码}),没有问题;我已经修改过了。非常感谢你的详细回答,我已经理解了原因!!