参考
https://www.cnblogs.com/GrimMjx/p/10105626.html
静态内部类
static是不能用来修饰类的
,但是成员内部类
可以看做外部类中的一个成员
,所以可以用static修饰
,这种用static修饰的内部类我们称作静态内部类,也称作嵌套内部类.
静态内部类适用于包含类当中,但又不依赖与外在的类,创建静态内部类时,不需要依赖外部类对象的引用
,也不能使用外在类的非静态属性和方法
,只是为了不让静态内部类被其他类使用而已
。
之所以要有静态内部类,是为了不让静态内部类被其他类使用而已。比如有A,B两个类,B有点特殊,虽然可以独立存在,但只被A使用。这时候怎么办?如果把B并入A里,复杂度提高,搞得A违反单一职责。如果B独立,又可能被其他类(比如同一个包下的C)依赖,不符合设计的本意。所以不如将其变成A.B,等于添加个注释,告诉其他类别使用B了,它只跟A玩。
静态内部类另一个用途是实现线程安全的单例模式,相见
静态内部类的优点是:外部类加载时并不需要立即加载内部类,内部类不被加载则不去初始化INSTANCE
,故而不占内存。即当SingleTon第一次被加载时,并不需要去加载SingleTonHoler,只有当getInstance()方法第一次被调用时,才会去初始化INSTANCE,第一次调用getInstance()方法会导致虚拟机加载SingleTonHoler类,这种方法不仅能确保线程安全,也能保证单例的唯一性,同时也延迟了单例的实例化
。
非静态内部类
非静态内部类编译后会默认的保存一个指向外部类的引用
,非静态内部类可以自由使用外部类的所有变量和方法
,内部类可以对同一个包的其他类隐藏
。
注意
- 非静态内部类的成员只是在非静态内部类范围是可知的,并不能被外部类直接使用,如果要访问非静态内部类的成员
必须显示创建非静态内部类对象来调用访问
! - 根据
静态成员不能访问非静态成员
的规则,外部类的静态方法不能访问非静态内部类。 - 非静态内部类
不允许定义静态成员
。
如果非静态内部类方法访问某个变量
,其顺序为:
该方法
是否有该名字的成员变量 - 直接用该变量名内部类中
是否有该名字的成员变量 - 使用this.变量名外部类中
是否有该名字的成员变量 - 使用外部类的类名.this.变量名