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