一、内部类整体概述

在一个类的内部完整定义另一个类,这个内嵌的类就是内部类,外层容器类称作外部类。内部类最大优势是可以直接访问外部类所有成员,包括私有变量与私有方法,封装性更强,还能变相实现多继承。Java一共分为成员内部类、局部内部类、静态内部类、匿名内部类四类。

二、成员内部类

成员内部类定义在外部类的成员位置,和成员变量、成员方法同级,能够使用public、private、protected、默认包访问权限修饰。它必须依托外部类实例对象才能创建,语法为外部类.内部类 对象名 = new 外部类().new 内部类()。
内部类可以无条件访问外部类任意成员;外部类想要使用内部类成员,必须手动创建内部类对象。缺点是无法脱离外部类单独实例化,独立复用性差。

三、局部内部类

局部内部类写在外部类的方法或者代码块内部,作用域被限制在当前方法内,出了方法就无法使用,不能添加任何访问权限修饰符。
它访问所在方法的局部变量时,该变量会被隐式final修饰,不允许重新赋值,仅适合方法内部一次性封装专属逻辑,对外完全隐藏。

四、静态内部类(嵌套类)

使用static修饰的成员内部类,属于外部类本身,不再依赖外部类实例就能直接创建对象,实例化语法:外部类.静态内部类 对象 = new 外部类.静态内部类()。
静态内部类仅能直接访问外部类静态成员,如果要调用外部普通实例成员,必须手动new外部类对象。常用来做Builder构建器、工具类分层、嵌套实体封装。

五、匿名内部类

没有自定义类名的局部内部类,只能用来实现接口或者继承父类,定义的同时直接实例化,仅能使用一次,不能重复创建多个对象,也无法自定义构造方法。
在Java8之前是接口回调、线程创建、界面事件监听最常用写法,无需单独新建实现类,快速重写抽象方法,代码紧凑。

六、实用案例总结

1. 成员内部类:外部类封装私有数据,内部类专属提供读取逻辑,外部无法直接接触私有字段;

2. 匿名内部类:快速创建线程任务、回调接口实现;

3. 静态内部类:业务实体嵌套子结构、工具类模块化拆分。

七、小节总结

四种内部类各有适用场景,核心区别集中在实例化条件、作用域、权限修饰上;内部类本质是细化封装粒度,适合把强关联逻辑收拢在同一个外部类中。

更多推荐