来自:Java世界
我知道static
只能与嵌套类一起使用,这使得它们等同于顶级类。我也明白这使他们能够独立于封闭类进行声明。
这就是理论,任何人都可以想出一个很好的实际例子来说明我们为什么需要这样做吗?(链接中的示例很可能是内部类 AFAIK 的示例)。
另外 - 问题背后的原因 - 为什么有一个模棱两可的名字,为什么“重用”这个词
static
并赋予它不同的内涵?
来自:Java世界
我知道static
只能与嵌套类一起使用,这使得它们等同于顶级类。我也明白这使他们能够独立于封闭类进行声明。
这就是理论,任何人都可以想出一个很好的实际例子来说明我们为什么需要这样做吗?(链接中的示例很可能是内部类 AFAIK 的示例)。
另外 - 问题背后的原因 - 为什么有一个模棱两可的名字,为什么“重用”这个词static
并赋予它不同的内涵?
当您的类自然嵌套时使用它,但不需要 Java 中内部类具有的自动魔术 $this 父引用。每个非静态内部类都有一个对其包含实例的嵌入式引用。当您实际上不需要该引用时,最好不要创建它。它可能会导致对象在内存中保留的时间比它们需要的时间长得多,并且当您开始序列化对象/尝试通过网络发送它们等时也会很痛苦。您最终可能会得到一个比您大得多的对象图预期或需要序列化!
Map.Entry 的实现就是一个很好的例子。将其嵌套在地图实现中显然是“自然的”,但不需要真正将父引用保留回地图。
对于#2,有什么不同?字段或方法上的静态意味着它是类定义的属性而不是实例。您无需实例即可访问和使用它。嵌套类上的静态也意味着它是类定义的一个属性,您可以在没有实例的情况下访问和使用它。
顶级类的可见性可能是公共的,也可能是包的;但是嵌套静态类的可见性也可能是私有的或受保护的。声明嵌套类还可以改进类的打包(结构)并关联它们的依赖关系,例如Map.Entry
. 虽然,它也可能是模棱两可的。
该词static
的含义是在类级别声明实例。例如,static int i
为一个类声明一个整数。一个顶级类与在类级别声明一个类是一样的。
我可以回答你的第二个问题。
其他一些关键字具有重载含义,因此static
示例不是唯一的。 static
甚至在静态导入的上下文中还有另一个含义。它是在另一个可能有意义的情况下重复使用您已经熟悉的单词,即使它具有完全不同的含义。
例如,final
可用于标识只能初始化一次的变量。它也有其他含义,例如识别不能被覆盖的方法。
super
并且synchronized
也用于多种情况。
- 这就是理论,任何人都可以想出一个很好的实际例子来说明我们为什么需要这样做吗?(链接中的示例很可能是内部类 AFAIK 的示例)。
这样做有助于垃圾收集。非静态内部类包含对外部类的引用。
例如:如果您有一个大型外部类创建一个 Runnable 以在某个任务列表中排队,则该 Runnable 的存在可能成为阻止它被收集的唯一因素。现在,内部类迫使 JVM 保留一块无用的堆空间,它可能不得不移出伊甸园并进入更难收集的幸存者空间。
- 另外 - 问题背后的原因 - 为什么有一个模棱两可的名字,为什么“重用”>静态这个词并赋予它不同的内涵?
你更喜欢怎么称呼它?在语言方面,使用静态不会导致语法上的任何歧义。对我来说,“静态”是有道理的。内部类的实例不是外部类实例的成员,反之亦然。
The shared meaning of static
across these contexts is 'resolvable at compile-time' (as opposed to having to look them up on an object instance and go through a virtual method table). This is applicable to static methods, static variables, and static inner classes. I think this is what happens when the compiler writer gets to choose your language keywords, conceptually he groups them all together as 'stuff I can optimize'.