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一个对方的实例对象才可以。

  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

15737443266

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值