2013-08-16 121 views
-1
Class A{ 

public void test(){ 
    B b = new B(); 
    System.out.println("Class Name: " + b.createClassC().getClass()); 
} 

} 

Class B{ 
    public C createClassC(){ 
    C c = new C(){ 
     @Override 
     public boolean equals(Object other){ 
     return true; 
     }  
    }; 
    } 
} 

Class C{ 
    int val = 8; 
} 

輸出類名稱?這會導致對象C上的.equals()始終失敗。我的理解是因爲getClass給出了封閉的類名,重寫的equals永遠不會被調用?爲Java匿名類

+3

這是**不**它輸出什麼。它輸出'package.name.here.B $ 1''$ 1'表示這是一個匿名類。 Dup:http://stackoverflow.com/questions/7172581/why-getclass-returns-the-name-of-the-class-1-or或 –

+0

@jahroy它是作爲[SSCCE](http:// sscce。組織/)。問題在於所假設的輸出不是實際輸出的。 –

回答

1

輸出是Class Name: class nz.test.anon.B$1美元符號很重要。 B $ 1表示B下的第一個匿名類。B $ 2表示第二個等等。

還你是如何運行你的代碼equals方法被調用

System.out.println("This is true: " + b.createClassC().equals(b)); 
System.out.println("and so is this: " + b.createClassC().equals(this)); 
+0

你知道一個明確指出匿名類命名的官方參考嗎? –

0

不知道。一些要注意的事項如下 -

  • 首先如果所有的main()方法在哪裏?你的程序如何啓動? 必須有在你的項目一個

public static void main(String args[])

方法。

  • 其次看你的方法

    公共ÇcreateClassC(){ C C =新C(){ @覆蓋 公共布爾等於(對象除外){ 迴歸真實; }
    }; }

函數簽名決定它應該返回C類的一個對象(或它的子類),但我沒有看到這樣的return語句。您必須return c;

最後,您的代碼的輸出是Class Name: class nz.test.anon.B$1其中B $ 1表示一個匿名類。