静态内部类

要理解静态内部类,先理解两个概念,静态和内部类。如果一个类的属性被static修饰为静态,那么在类加载完成后就已经被初始化,即已经可以通过类名.属性名来调用了,不需要先去实例化这个类。这是因为之前提到的类加载过程,加载——>验证——>准备——>解析——>初始化。准备阶段给静态变量分配内存空间和初始值(null,0之类),初始化阶段即对这些变量做初始化操作。一个类在生命周期类只会被加载一次,也就是说被static修饰的属性只会被初始化一次,这可用于线程安全。而内部类的概念算是编码的一种优化,如果在类中定义了一个内部类,即这个内部类只会被这个外围类调用,这样就不需要专门去写一个.java文件去定义这个类的。理解了这两个概念后,静态内部类就不难理解了。

静态内部类在其外围类加载完成后就已经被初始化好,这就需要其不能依赖于外围类的非静态的成员变量。这也是其和成员内部类最明显的区别。

假设school是外围类,student是静态内部类,由于静态内部类是外围类加载完成后就被初始化好了,所以不必先去实例化外围类,可以直接school.student student = new school.student()去实例化。对比之下如果student是成员内部类,就需要先去实例化school,再实例化student,即school.student student = new school().new student()。

这里涉及到内部类的访问规则,其实访问内部类和访问类的属性一样,通过类名.内部类名来访问。而静态内部类有更严格的访问规则,都是由于static特性。

1.静态内部类中只能访问外围类的静态成员变量

2.外围类的非静态方法不能访问静态内部类中的属性

3.外围类访问静态内部类中属性要通过静态内部类名.属性的方法。

这里有一个容易混淆的地方,静态内部类中是可以定义静态成员变量和非静态成员变量的,这些非静态成员变量是在静态内部类被实例化的时候去初始化,和外部类有层嵌套的概念。                                                                                                                                                                                                                           

    原文作者:滴哩哩哩滴哩哩哩哒哒
    原文地址: https://blog.csdn.net/weixin_42447959/article/details/82765113
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞