创建匿名类的方式一般是 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);
}
};