Java 匿名类双大括号初始化


#Java 笔记


创建匿名类的方式一般是 new 后面跟一个接口名,然后去实现该接口

例如现将一个基于 Runnale 接口的对象,放入 Thread 中:

public class Main {

    public static void main(String[] args) throws InterruptedException {

        Thread t = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("hi");
            }
        });

        t.start();
        t.join();
    }

}

运行上面的代码,会输入hi

new 后面也可以跟一个具体的类名,然后重新实现类中的方法

示例:

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

public class Main {

    public static void main(String[] args) throws InterruptedException {

        Map<String, String> map = new HashMap<String, String>() {
            @Override
            public String put(String key, String value) {
                System.out.println("调用了 put 方法");
                return super.put(key, value);
            }
        };

        map.put("a", "1");
        map.put("b", "2");

        System.out.println( map );
    }

}

运行代码,输出:

调用了 put 方法
调用了 put 方法
{a=1, b=2}

new 后面跟一个具体的类名,可以用双大括号初始化对象的内容

例如:

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

public class Main {

    public static void main(String[] args) {

        Map<String, String> map = new HashMap<String, String>() {{ // 注意,这里用了双大括号
            put("a", "1");
            put("b", "2");
        }};

        System.out.println(map);

    }

}

运行后输出:

{a=1, b=2}

上面的代码中,map 是一个基于 HashMap 的匿名类生成的对象。通过两个大括号,直接调用 put 方法(可以理解为在匿名类的内部编写代码),初始化对象的数据。

注意,双大括号并不是特殊的语法。类的实现需要一层大括号,匿名类的初始化需要一层大括号,如果只做初始化就是双大括号。

如果重写函数,就不是双大括号了:

HashMap<String, String> map = new HashMap<String, String>() {
    // 初始化
    {
        put("name", "b");
        put("age", "18");
    }
    // 重写 put 方法
    @Override
    public String put(String key, String value) {
        System.out.println("调用了 put 方法");
        return super.put(key, value);
    }
};


( 本文完 )