java 中的内部类,按类型看大致可以分为 3 类,分别是:
成员内部类
、局部内部类
以及匿名内部类
成员内部类
形式如下:
1 | class Outer{ |
外部类 Outer
中位于成员位置,再定义一个类 Inner
,这个类就是 Outer
的内部类。
内部类在编译时,会生成自己对应的 class 文件,但它的访问要通过其外部类完成。
这里,我们要运行内部类 Inner
中的 tell
方法,流程如下:
1 | public class Test{ |
如果,我们给 Inner
加上 static
修饰符,那么我们就能通过 Outer.Inner
调用内部类的 class。进一步,要想获得 Inner
的对象,可以通过 Outer.new Inner()
获得。如果,Inner
中的 tell
方法也加上 static
修饰符,我们直接通过 Outer.Inner.tell()
,就可以执行 tell
方法,整个过程没有实例化任何对象。
局部内部类
顾名思义,和局部变量类似,局部内部类是存在与方法体中的类,形式如下:
1 | class Outer{ |
局部内部类的作用域范围仅局限于方法内部,出了方法之后就无法使用了
因此,无法在其他类,例如测试类 Test
中实例化局部内部类 Inner
,更不用说调用其中的 tell
方法了。
唯一的途径是,直接在 Inner
所在的方法体中,实例化 Inner
对象 i
,然后调用 tell
方法,如上所示。
匿名内部类
特点
- 可以看做是一种没有名字的局部内部类
- 定义在方法中
- 必须在定义匿名内部类时创建它的对象
格式
1 | new 类/接口(){ |
原理:创建了继承了这个类
的子类对象或者实现了这个接口
的子类对象
应用场景
作为参数进行传递,因为只使用一次,无需专门写一个 java 文件继承父类或接口,直接通过匿名内部类的方式比较简洁。
v1.5.2