Java 的匿名内部类有哪些限制?
无处不在的匿名内部类
button.setOnClickListener(new OnClickListener(){
});
在虚拟机中,匿名内部类有名字, OuterClass$1
class RunnableFoo extends Foo implements Runnable{
};
匿名内部类不能这样写,但是局部类可以,但是kotlin可以这样写 val runnableFoo = object: Foo(), Runnable{}
匿名内部类的构造方法, 编译器生成 , 参数列表包括
1、外部对象(定义在非静态域内)
2、父类的外部对象(父类非静态)
3、父类的构造方法参数(父类有构造方法且参数列表不为空)
4、外部捕获的变量(方法体内有引用外部 final 变量)
匿名内部类容易引起 内存泄漏
总结
1、没有人类认知意义上的名字
2、只能继承一个父类货值实现一个接口
3、父类是非静态的类型,择需父类外部实例来初始化
4、如果定义在非静态作用域内,会引用外部类实例
5、只能捕获外部作用域内的 final 变量
6、创建时只有单一方法的接口可以用 lambda 转化