匿名类,可以是实现接口,也可以是继承一个类
Thread t = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("你好");
}
});
t.start();
t.join();
这个示例很常见,new Runnable(){...}
便是声明的一个实现 Runnable 接口的匿名类。
匿名类,也可以是继承自某个类,例如:
HashMap<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("name", "letian"); // 会输出 "调用了 put 方法"
匿名类的名字
匿名类没有名字,但Java会给它一个名字,名字是所在类$序号
,例如:
public class Demo {
public static void main(String[] args) {
Runnable task = new Runnable() {
@Override
public void run() {
System.out.println("你好");
}
};
System.out.println(task.getClass().getName());
}
}
运行后会输出:
Demo$1
我们再看下,多个匿名类的效果:
public class Demo {
public static void main(String[] args) {
Runnable task1 = new Runnable() {
@Override
public void run() {
System.out.println("你好");
}
};
Runnable task2 = new Runnable() {
@Override
public void run() {
System.out.println("你好");
}
};
System.out.println(task1.getClass().getName());
System.out.println(task2.getClass().getName());
}
}
运行后会输出:
Demo$1
Demo$2
匿名类的初始化
初始化,用花括号括起来就行,相当于匿名类的无惨构造函数。
示例:
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);
}
};
匿名类的内部属性
匿名类是可以声明属性的。示例:
public class Demo {
public static void main(String[] args) throws InterruptedException {
String message = "你好";
Runnable task = new Runnable() {
private String msg;
{
this.msg = message;
}
@Override
public void run() {
System.out.println(msg);
}
};
Thread t = new Thread(task);
t.run();
t.join();
}
}
匿名类可以使用有参构造函数传入数据
public class Demo {
public static class NamedRunnable implements Runnable {
private String name;
public NamedRunnable(String name) {
this.name = name;
}
public String getName() {
return name;
}
@Override
public void run() {
}
}
public static void main(String[] args) throws InterruptedException {
String taskName = "任务1";
Runnable task = new NamedRunnable(taskName) {
@Override
public void run() {
System.out.println(getName());
}
};
Thread t = new Thread(task);
t.run();
t.join();
}
}