为什么Java内部类要设计成静态和非静态两种

作者:Paranoid
链接:https://www.zhihu.com/question/28197253/answer/365692360
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
 

首先,我们需要明白,为什么要设计Java内部类?然后再去探究为何又将内部类设计为静态与非静态两种。

将一个类设计成内部类,我觉得有两方面因素:

  1. 在一个类内部,需要操作某种属性,而这个属性需要涉及的面又很广,我们可以考虑,将这些属性设计为内部类。
  2. 然后就如下面XX用户回答的那样,好比你设计类 B 的目的只是为了给类 A 使用,那么,我们就可将其设定为内部类,没有必要将类 B 设置成单独的 Java 文件,防止与其他类产生依赖关系。

然后我们再来说说为什么又将内部类设计为静态内部类与内部类:

  1. 首先来看一下静态内部类的特点:如XX用户所述那样,我是静态内部类,只不过是想借你的外壳用一下。本身来说,我和你没有什么“强依赖”上的关系。没有你,我也可以创建实例。那么,在设计内部类的时候我们就可以做出权衡:如果我内部类与你外部类关系不紧密,耦合程度不高,不需要访问外部类的所有属性或方法,那么我就设计成静态内部类。而且,由于静态内部类与外部类并不会保存相互之间的引用,因此在一定程度上,还会节省那么一点内存资源,何乐而不为呢~~
  2. 既然上面已经说了什么时候应该用静态内部类,那么如果你的需求不符合静态内部类所提供的一切好处,你就应该考虑使用内部类了。最大的特点就是:你在内部类中需要访问有关外部类的所有属性及方法,我知晓你的一切... ...

总结:首先需要知道为什么会有内部类,什么时候应该使用内部类,我们再去讨论,为什么 Java 的设计者们又将内部类设计为静态与非静态,这样就很清晰了。

很多人爱分析HashMap源码,HashMap源码就有个静态内部类的经典使用,HashMap把put进去的一个key value包装成一个Node,该Node就是静态内部类。

猜你喜欢

转载自blog.csdn.net/flyfeifei66/article/details/82686086