问题1:
首先我们都知道,接口和抽象都是不能用new来实例化的。
疑问:那么为什么按钮单机事件setOnClickListener中new的是一个接口(OnClickListener)?
这个问题先放一放。看见这个问题知道了,原来接口是可以new,只是不能实例化而已。那么又出来了一个问题。
疑问:接口和抽象类new出来是个什么东西呢?
可以使用匿名类的方式new出来,但必须实现接口中的所有接口方法和抽象类中的所有抽象方法。
回到第一个疑问:那么为什么按钮单机事件setOnClickListener中new的是一个接口(OnClickListener)?
这是实质上是使用匿名接口来实现匿名内部类的, 匿名接口这样写是会自动生成一个实现了该接口的匿名类。
问题2:匿名内部类没有构造器,编译时又哪来的
问题由来:局部内部类和匿名内部类只能访问局部final常量(局部变量和形参都必须用final),(jdk1.8之前需要人为加,在jdk1.8之后不需要加final因为局部变量和形参都默认添加了final)。
探讨这个问题到匿名内部类访问外部形参的时候看到了:匿名内部类Test$1的构造器含有两个参数,一个是指向外部类对象的引用,一个是int型变量。(等等,匿名内部类不是没有构造器的吗?这是怎么来的)。
匿名内部类是没有构造函数的,但是可以使用基类的构造函数。
疑问:那用接口实现的匿名内部类是什么情况呢,它又没有构造函数。
当通过接口来创建匿名内部类时,匿名内部类不能显示创建构造器,因此匿名内部类里只有一个隐式的无参构造器,故new接口名后的括号里不能传入参数值。
总结:
当通过接口来创建匿名内部类时,匿名内部类不能显示创建构造器,因此匿名内部类里只有一个隐式的无参构造器,故new接口名后的括号里不能传入参数值。
如果通过继承父类来创建匿名内部类时,匿名内部类将拥有和父类相似的构造器,此处的相似指的是拥有相同的形参列表。
当然,为了弥补没有构造器的缺陷,匿名内部类可以定义初始化块以初始化对象;