3

他のコードを読んでいるときに、この構文に出くわしました

Map<String, String> map = new HashMap<String, String>() {
    { 
         put("a", "b");
    }
};

使い方はわかるanonymous inner classが、これは何か違うようだ。上記が正確にどのように機能し、 とどのように違うのか、誰か説明してもらえますかMap<String, String> map = new HashMap<String, String>(); map.put("a", "b");?

4

2 に答える 2

6

基本的に、匿名クラスのインスタンスを作成し、インスタンスの初期化子を指定しています。通常のクラスの観点から考えてください。たとえば、次のようになります。

class Person {

  String age, name;

  List<String> hobbies;

  {
    hobbies = new ArrayList<String>();
  }

  public Person(String name, String age) {
    this.name = name;
    this.age = age;
  } 

}

上記は何をしていると思いますか?あなたの匿名クラスは似たようなことをしています。:)

于 2012-08-01T11:31:54.990 に答える
2

Sanjay T. Sharma が明確に説明したように、匿名クラスのインスタンスを作成しています。実際、それは伸びていjava.util.HashMapます。次のコードを検討してください。

package com.test;

import java.util.HashMap;
import java.util.Map;

public class Demo {
    public static void main(String[] args) {
        Map<String, String> mapSimple = new HashMap<String, String>();
        System.out.println("Simple java.util.HashMap:");
        System.out.println("\t" + mapSimple.getClass());

        Map<String, String> map = new HashMap<String, String>() {
            {
                put("a", "b");
            }
        };

        System.out.println("Anonymous class based on java.util.HashMap:");
        System.out.println("\t" + map.getClass());
        System.out.println("\t" + map.getClass().getSuperclass());
    }
}

次の出力が生成されます。

Simple java.util.HashMap:
    class java.util.HashMap
Anonymous class based on java.util.HashMap:
    class com.test.Demo$1
    class java.util.HashMap

このような無名クラスの名前と、このクラスが拡張することに注意してjava.util.HashMapください。

于 2012-08-01T11:42:53.973 に答える