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;
}

出力: クラス名: package.name.here .B

匿名クラス型が getClass() メソッドで囲んでいるクラスを与える理由を誰か教えてもらえますか? これにより、オブジェクト C の .equals() が常に失敗します。私の理解では、 getClass が囲んでいるクラス名を指定するため、オーバーライドされた equals は呼び出されませんか?

4

2 に答える 2

1

コードをどのように実行しているかわかりません。注意すべき点は次のとおりです。

  • まず、main() メソッドはどこにあるのでしょうか? あなたのプログラムはどのように始まりますか? あるに違いない

public static void main(String args[])

プロジェクトのメソッド。

  • 第二にあなたの方法を見てください

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

関数シグネチャは、クラス C (またはそのサブクラス) のオブジェクトを返す必要があることを示していますが、そのような return ステートメントはありません。絶対ですreturn c;

最後に、コードの出力は、Class Name: class nz.test.anon.B$1B$1 が無名クラスを意味するものです。

于 2013-08-16T04:18:17.697 に答える
1

出力はClass Name: class nz.test.anon.B$1ドル記号が重要です。B$1 は B の下の最初の匿名クラスを意味します。B$2 は 2 番目などです。

また、 equals メソッドが呼び出されています

System.out.println( "This is true: " + b.createClassC().equals(b) );
System.out.println( "and so is this: " + b.createClassC().equals(this) );
于 2013-08-16T01:44:08.747 に答える