1. 匿名内部类(Anonymous Classes)
- 没有类名的局部内部类 (一切特征都与局部内部类相同)
- 必须继承一个父类或者实现一个接口 (用来创建接口或抽象类的实例)
1.1 语法
语法: new 父类() { 子类内容 };
匿名类是一个表达式,所以用分号;
结束
1.2 创建匿名类
必须继承一个父类或者实现一个接口
方式一:继承类
Thread thread = new Thread() {
@Override
public void run() { }
};
方式二:实现接口
Runnable runnable = new Runnable() {
@Override
public void run() { }
};
编译后

2. 接口回调
匿名内部类是唯一一种没有构造器的类,大部分匿名内部类用于接口回调
@Test
public void test() {
BizProcess bizProcess = new BizProcess();
// 设置
bizProcess.setBizService(new BizService() {
@Override
public String execute(String business) {
return "execute " + business;
}
});
// 回调
bizProcess.execute("process");
}
public interface BizService {
String execute(String business);
}
public class BizProcess {
private BizService bizService;
public void setBizService(BizService bizService) {
this.bizService = bizService;
}
public void execute(String business) {
String result = bizService.execute(business);
System.out.println(result);
}
}
3. 局部内部类改为匿名内部类
public static void main(String[] args) {
// 局部内部类(定义在方法中的类)
class Mouse implements Usb {
@Override
public void service() {
System.out.println("Mouse run....");
}
}
Usb usb = new Mouse();
usb.service();
}
局部内部类使用一次后就不再使用,优化方式:改为匿名内部类
public static void main(String[] args) {
// 相当于创建了一个局部内部类
Usb usb = new Usb() {
@Override
public void service() {
System.out.println("run...");
}
};
usb.service();
}
4. 其他
4.1 为什么局部变量需要 final修饰
public static void main(String[] args) {
int num = 0; // JDK1.7前,必须加上 final
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println(num++); // 报错,num 不能操作
}
};
}
因为局部变量和匿名内部类的生命周期不同
匿名内部类是创建后是存储在堆中的,而方法中的局部变量是存储在Java栈中,当方法执行完毕后,就进行退栈,同时局部变量也会消失
4.2 其他示例
public class Demo {
public static void main(String[] args) {
// 匿名内部类 Demo$1
List<String> list = new ArrayList<String>() {{
add("111");
add("222");
}};
}
}
4.3 匿名类的实例作为参数传递
public void test() {
// 创建接口实例
Comparator<Integer> comparator = new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return Integer.compare(o1, o2);
}
};
// 匿名类的实例作为参数传递 TreeSet(Comparator<? super E> comparator) {}
TreeSet<Integer> ts = new TreeSet<>(comparator);
// 或者
TreeSet<Integer> ts = new TreeSet<>(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return Integer.compare(o1, o2);
}
});
}
网友评论