目录
- 我的学习过程
- 匿名内部类概述
- 匿名内部类探究
- 代码验证(匿名内部类是一个实例)
- 结论
我的学习过程
昨天想学习一下Java8新特性,看到Lambda表达式可以替代匿名内部类。我对匿名内部类不太理解,决定学习一下。并进行了下面的归纳和思考。
匿名内部类概述
继承式匿名内部类声明格式:
new 类名(){};
接口式匿名内部类声明格式:
new 接口名(){
//接口中方法要重写(@Override可省略,不需要重写接口的全部方法)
...
};
匿名内部类有什么特点呢?
- 匿名内部类没有类名,它也就不能定义出构造器,所以它没有自己的构造器。
- 匿名内部类是隐式地继承了一个特定的类,或者隐式地实现了一个特定的接口。
- 匿名内部类无法定义静态成员和静态方法。
- 匿名内部类不能用public,protected,private,static修饰。
- 匿名内部类只能创建一个实例。
匿名内部类探究
匿名内部类是一个实例吗?
答:继承式匿名内部类是一个实例,接口式匿名内部类不是一个实例。有待考证*1
我的思考:
隐名内部类由于没有类名,就没有自己的构造器。
对于继承式匿名内部类来说,匿名内部类是某个特定类的子类,使用new时候,相当于通过父类构造器实例化了一个实例。
对于接口式匿名内部类来说,匿名内部类是实现了某个特定的接口,使用new的时候,相当于实现了特定接口,不是实例化。
有待考证*1
另外想法:接口式匿名内部类是一个类,使用new时,就是相当于实例化了一个对象,只是对象内部实现了特定接口,所以是一个实例。倾向于认为:接口式匿名内部类也是一个实例。
进一步考证*1
接口式匿名内部类是一个实例。
代码验证(匿名内部类是一个实例)
代码文件包含(同一个包下):类:Car.java、接口:CarFun.java、main函数验证:Test.java
类:Car.java
上图说明:这是一个叫Car的类,它实现了CarFun接口,对接口中的drive()和stop()方法进行了重写。
接口:CarFun.java
上图说明:这个是叫CarFun的接口,它有drive()和stop()两个方法。
main函数验证:Test.java
==进一步待考证*1:==匿名内部类可以传参数吗?我这里示例传了参数height的值175,所以它还是匿名内部类吗?
进一步考证*1
去掉height参数。代码如下:
通过第8行的zerocar.getHeight()语句打印,执行结果得到
Height: 0
说明:不传参数时候,zerocar是一个实例对象,匿名内部类是一个实例。
思考:所以有参数情况下还是一个匿名内部类吗?
暂时不知道。有待进一步考证*2
这部分在main函数下写了继承式匿名内部类。它是一个Car的子类,通过Car的有参构造器实例化了一个实例zerocar。
//Car的有参构造器
public Car(int height, int weight) {this.height = height;}
且通过第7行的zerocar.getHeight()语句打印,执行结果得到
Height: 175
进一步印证了zerocar是个实例对象。
(续上一张图片)
这部分在main函数下写了接口式匿名内部类。我选择把接口CarFun里的两个方法都进行了重写(不一定要全部方法重写,因为此处可以省略@Override)。并用zerocarfun调用了drive()和stop()方法。执行结果:
zero开车了,已经开了0.2600633412878144千米
zero停车了
执行成功,说明zerocarfun可以调用方法,说明它是一个对象。所以接口式匿名内部类也是一个实例。
同时验证了:
继承式匿名内部类是通过父类构造器实例化,可以是有参构造器,也可以是无参构造器。
同时发现:
继承式匿名内部类的花括号内写不了打印语句,因为我写的打印语句println报红,末尾分号颜色变灰色。
【报错1】:Cannot resolve symbol ‘println’
【报错2】:Unnecessary semicolon ‘;’
Inspection info: Reports on any unnecessary semicolons, whether between class members, inside block statements, or after class definitions. While valid Java, these semicolons are redundant, and may be removed.
这个和百度百科中Java内部类-继承式匿名内部类的写法有出入。为什么我这边不能用打印语句呢?
百度一下。没百度到原因。有说缺少main函数导致。可是我的代码并不缺少main函数。难道是继承式匿名内部类开辟了另外一个区域,独立于main函数了吗?有待考证*2
结论
匿名内部类它是一个实例。