2014-12-01 135 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。