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文件继承父类或接口,直接通过匿名内部类的方式比较简洁。