今天在看spring内的线程池的源码发现这么一块代码,是之前没有见过的,它是先
ThreadPoolExecutor executor = new ThreadPoolExecutor(xx,xx,xx,xx,xx){
//直接重写了方法
}
,没有见过这么操作的,于是开始研究
spring里面的ThreadPoolTaskExecutor#initializeExecutor方法中的
研究解释:
在 Java 中,当你创建一个新的对象时,通常情况下不会直接在 new 表达式中重写方法。但是,有一种特殊情况允许这样做,那就是使用 匿名内部类。
匿名内部类
匿名内部类是一种特殊的类,它没有显式的名称,通常用于实现接口或继承某个类,并且只在声明它的位置被使用。这种类可以在创建对象的同时定义,并且可以在其中重写或实现所需的方法。
如何使用匿名内部类重写方法
当你使用匿名内部类时,可以在 new 表达式中直接提供一个类的实现细节,包括重写的方法。例如,如果你有一个接口 Runnable,你可以像下面这样创建一个实现了 Runnable 接口的匿名内部类对象,并重写 run() 方法:
new Runnable() {
@Override
public void run() {
// 在这里实现 run 方法
}
};
只不过这个有很多形参倒是很陌生,所以没看出来,而且Runnable和Thread都是单方法接口,ThreadPoolExecutor是多方法的普通类。所以多方法的普通类也支持匿名内部类
ThreadPoolExecutor executor = new ThreadPoolExecutor(xx,xx,xx,xx,xx){
//直接重写了方法
}
为什么可以这样做
- 语法糖:这是一种语法糖,允许你在创建对象的同时提供类的实现。
- 局部类:匿名内部类本质上是一个局部类,它只能在创建它的那个方法或构造器内使用。
- 继承与实现:匿名内部类可以继承一个类或实现一个接口,并且可以在创建时重写必要的方法。
- 单次使用:通常匿名内部类是为了单次使用而设计的,因此没有必要给它们命名。
又学到了一个知识点