1、在一个类的内部存在一个形如:权限修饰符 static class 内部类名字 { 成员 }
限制规则如下:
(1)、访问外部类限制。
内部类不能访问任何外部类的非static成员变量和非static方法。只能访问外部类的static成员变量和static方法,但是可以在内部类定义外部类对象,然后通过外部类对象访问外部类的非static成员变量和非static方法,内部类使用外部类,而不是成员。(静态成员/非静态成员/类本身,仅仅是不能直接使用非静态成员而已)。静态内部类是不需要依赖于外部类的,这点和类的静态成员属性有点类似,并且它不能使用外部类的非static成员变量或者方法。因为在没有外部类的对象的情况下,可以创建静态内部类的对象,如果允许访问外部类的非static成员就会产生矛盾,因为外部类的非static成员必须依附于具体的对象。非静态内部类在编译完成之后会隐含地保存着一个引用,该引用是指向创建它的外围内,但是静态内部类却没有。没有这个引用就意味着:它的创建是不需要依赖于外围类的。它不能使用任何外围类的非static成员变量和方法。
(2)、内部类成员限制。
成员变量和类变量,也可以定义成员方法和类方法,还可以定义代码块和静态代码块。普通内部类不能声明static的方法和变量,注意这里说的是变量,常量(也就是final static修饰的属性)还是可以的,而静态内部类形似外部类,没有任何限制。
(3)、内部类加载时机。
加载一个类时,其内部类不会同时被加载。一个类被加载,当且仅当其某个静态成员(静态域、构造器、静态方法等)被调用时发生。
(4)、编译后生成.class文件。
每个类会产生一个.class文件,文件名即为类名。同样,内部类也会产生这么一个.class文件,但是它的名称却不是内部类的类名,而是有着严格的限制:外围类的名字,加上$,再加上内部类名字。
(5)、访问权限控制。
内部类可以拥有private访问权限、protected访问权限、public访问权限及包访问权限。如果成员内部类Inner用private修饰,则只能在外部类的内部访问,如果用public修饰,则任何地方都能访问;如果用protected修饰,则只能在同一个包下或者继承外部类的情况下访问;如果是默认访问权限,则只能在同一个包下访问。这一点和外部类有一点不一样,外部类只能被public和包访问两种权限修饰。由于成员内部类看起来像是外部类的一个成员,所以可以像类的成员一样拥有多种权限修饰。
(6)静态类的使用场景。
外部类需要使用内部类,而内部类无需使用外部类的资源。内部类可以独立外部类创建对象。使用静态内部类的好处是加强了代码的封装性以及提高了代码的可读性。使用静态内部类,多个外部类的对象可以共享同一个内部类的对象。 内部类一般只为其外部类使用。内部类提供了某种进入外部类的窗户。也是最吸引人的原因,每个内部类都能独立地继承一个接口,而无论外部类是否已经继承了某个接口。因此,内部类使多重继承的解决方案变得更加完整。
3、静态内部类的加载时机。验证如下:
###############################################################################################################################################
#######################################################################################################################################
因此,根据内部类不会在其外部类被加载的同时被加载的事实,我们可以引申出单例模式的一种实现方式。该实现方式比较简单,而且既实现了由前述事实所保证的惰性初始化(Lazy-Initialazation),又由JVM保证了多线程并发访问的正确性。使用内部类可以避免这个问题,因为在多线程环境下,jvm对一个类的初始化会做限制,同一时间只会允许一个线程去初始化一个类,这样就从虚拟机层面避免了大部分单例实现的问题
########################################################################################################################################
因为静态内部类独立于外部类,所以两者加载是没有顺序要求的,完全可以静态内部类加载了,而外部类还没加载。如下所示:
######################################################################################