糖尿病康复,内容丰富有趣,生活中的好帮手!
糖尿病康复 > Java 静态内部类 的详细解释

Java 静态内部类 的详细解释

时间:2022-11-03 16:09:34

相关推荐

Java 静态内部类 的详细解释

写法格式: 所处的位置跟常规内部类一样,不同的是 在常规内部类前面加上static关键字,静态的形式如下:

01:静态内部类 的成员可以是 静态的数据域 和 静态的方法 ,因为这个类是静态的, 在加载的时候一并被加载进去如下图:

//解释: 这个Outer在被虚拟机加载的时候, name被初始化, 因为StaticInner 依然是一个静态的的 所以也会被初始化。 最终的形式如下:

Class的实例对象是一个 Outer类模板的实例,上面有的初始化元素是 静态name, 和一个静态的类StaticInner.

而这个静态的类上面也有静态的元素 school,因此一步到位也会被初始化。

最终在堆内存中的形式如下:

他们的规律如下:

01:静态内部类 是 外部类的一个 静态成员,在虚拟机加载的时候 被初始化, 初始化 静态内部类 的静态数据域, 和 激活静态方法 ===》 同样生成 一个Class 对象的形式。

02:这个静态内部类 的Class实例对象 , 跟 外部类 的 Class实例对象 没有任何关系 , 仅仅 静态内部类 是外部类的一个静态成员而已。

03:由于是静态内部类, 所以在虚拟机加载的时候被初始化,所以静态内部类中可以有静态的方法和静态的数据域。

04:静态内部类的 静态方法 , 可以直接访问 外部类的 静态数据域, 和 静态方法,因为他们在虚拟机加载的时候应被初始化,和被激活 。

05:此时的内部类 和 外部类 他们之间的实例对象没有任何关系 , 仅仅内部类是一个外部类的静态变量而已。

在内部类的静态方法中也可以访问 外部类的实例方法,但是前提是 , 必须 先有 这个外部类的实例对象(因为他们之间的对象没有任何关系), 因为虚拟机加载的时候都加载了外部类和内部类的静态数据域,所以在访问外部类静态数据域的时候 , 完全可以不必创造一个外部类的实例对象。

但是在访问 外部类的实例数据的时候 必须先创建一个 外埠类的实例对象!

06:此时的内部类的实例方法 , 也可以直接访问 内部类 的 静态数据(jvm加载过了),也可以访问自己内部类的实例数据域(此时对象已经被创建出来了)。=====>>完全吻合 之前的继承和 封装型。

注意访问静态数据域和静态方法的时候使用对应的类名字。

内部类的实例方法也可以访问外部类的静态数据域(jvm加载过了),但是不可以直接访问外部类的实例数据域, 必须先创建一个外部类的实例对象,然后才可以访问外部类的实例数据域,因为上图表示的原因,他们实例之间没有任何关系。

注意访问静态数据域和静态方法的时候使用对应的类名字。

07:外部类的静态方法 可以直接访问内部类的静态数据域(jvm虚拟机加载过了)和静态方法。

但是外部类不可以直接访问内部类的实例数据域,因为此时内部类并不是一个对象,因此必须先创建一个内部类的实例对象,然后在访问内部类的 实例数据域的内容。

注意访问静态数据域和静态方法的时候使用对应的类名字。

外部类的实例方法,可以直接访问 内部类的静态数据域, 但是不可以直接访问 内部类的实例数据域,必须先创建一个内部类的对象,然后使用这个内部类的对象来访问内部类的实例数据域。

注意访问静态数据域和静态方法的时候使用对应的类名字。

----- 以上都是在 外部类 的 作用范围之内 访问来访问去的, 此时内部类是外部类的一个成员变量,我们不必需要考虑封装性。

08:在外部类之外的任何 类中 , 要访问内部类的时候,首先要考虑,这个外部类的封装性, 然后考虑外部类中的内部类的封装性。 剩下的依然要牢记, 他们之间的关系,仅仅是内部类是一个外部类的静态成员,被虚拟机加载的时候初始化(这里的初始化,并不是说 new一个内部类的对象,而是将内部类的 静态数据域初始化, 静态方法激活 ,同时 创造一个 Class 的类模板对象 Outer.StaticInner而已!)。 他们之间的实例对象依然是没有任何关系。

因此在外部类之外的任何类中, 想访问那个类就 new对应类的名字:

想访问外部类 : new Outer();

想访问内部类:new Outer.Inner(); 而不是new Outer().new Inner(); 因为对象之间没有任何关系。

想通过内部类访问外部类的时候,也不需要担心 ,因为实例之间没有任何关系,在静态内部类的时候已经 创建过外部类对象,并且调用过了, (我们在通过静态内部类访问外部类的时候 已经在静态内部类中中按照 规范 写好了代码 ) ,我们尽管调用就行了。

总结: —>外部类 和 静态内部类 , 他们之间的静态数据域和静态方法可以相互沟通数据。

除此之外,无论是在外部类 还是在 内部类 的任何静态方法 还是 实例方法,要想访问到彼此的实例数据,都必须new一个对方的实例对象才可以。

如果觉得《Java 静态内部类 的详细解释》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。