接口、抽象类与new之间的爱恨情仇(匿名内部类没有构造器,编译时又哪来的)

问题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接口名后的括号里不能传入参数值。

        如果通过继承父类来创建匿名内部类时,匿名内部类将拥有和父类相似的构造器,此处的相似指的是拥有相同的形参列表。

当然,为了弥补没有构造器的缺陷,匿名内部类可以定义初始化块以初始化对象;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

撩得Android一次心动

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值