2014-12-01 106 views
0

为什么第二个SOP在这里显示输出为真,我希望它会像第一个SOP一样显示错误?Java反射类

public class reflect1 { 

    public static void main(String[] args) { 

     Reflect1A obj1 = new Reflect1A(); 
     Reflect1A obj2 = new Reflect1A(); 

     System.out.println(obj1 == obj2); 

     Class c1 = obj1.getClass(); 
     Class c2 = obj2.getClass(); 

     System.out.println(c1 == c2); 

     } 
    } 

class Reflect1A { 

} 
+0

String类的实例对于String对象的所有实例都是相同的。 – 2014-12-01 16:32:34

回答

3

Java Language Specification

  • getClass返回Class对象,它表示的类的方法物体。

A Class对象存在于每个参考类型中。对于 示例,它可用于发现类的完全限定名称,其成员,其直接超类以及它实现的所有接口。

由于您的对象都是Reflect1A类型,它们都返回相同的Class对象。

你会做

Class<?> clazz = Class.forName("com.example.Reflect1A") 
System.out.println(c1 == clazz); // true 

得到相同的对象(though this is not necessarily required by all classloaders

1

第一行打印假,因为它是一个不同实例的相同类的

第二行显示为true,因为它是相同类型。如果您处于多个类加载器环境中,则需要注意这个模糊的问题。像JBoss,或OSGI等应用程序服务器,也可以有两个类实例为不等于

1

一个目的是等于(==)不仅对本身。所以很明显,两个getClass()语句返回相同的Class对象

3

obj1obj2的值指的是不同的对象 - 当您在Java中使用==并且两个操作数都是引用时,结果是比较这些引用是否引用完全相同的对象。在这种情况下,你有两个不同的对象,所以引用是不是相同。

但是,他们都是相同的,所以这就是为什么c1 == c2为真。

0

操作==比较在其通过默认

OBJ1和OBJ2是相同类型的类Reflect1的创建的对象的引用。因为这些对象只有在比较像这个obj1.equal(obj2)时才是相等的。

虽然obj1和obj2的类类型相同==操作将是true。