来自:JavaWorld
我理解static
只能与嵌套类一起使用,这使它们等同于顶级类。我也理解这可以使它们独立于封闭类声明。
这就是理论,任何人都可以想到一个很好的实际例子,说明为什么我们需要这样做? (链接中的示例很可能是内部类AFAIK的示例。)
此外 - 问题背后的原因 - 为什么有一个含糊不清的名称,为什么“重复使用”单词static
并给它一个不同的含义?
答案 0 :(得分:4)
当您的类自然嵌套时使用它,但不需要内部类在Java中使用的auto-magic $ this父引用。每个非静态内部类都包含对其包含实例的嵌入式引用。当您实际上不需要该引用时,最好不要创建它。它可能导致对象在内存中停留的时间比它们需要的时间长得多,当你开始序列化对象/尝试通过网络发送它们时,它也会很痛苦。你最终可能会得到比你更大的对象图。预期或需要序列化!
Map.Entry的实现就是一个很好的例子。它嵌套在地图实现中显然是“自然的”,但是没有必要真正将父引用保存回地图。
对于#2,它有什么不同?字段或方法上的静态意味着它是类定义的属性而不是实例。您无需实例即可访问和使用它。嵌套类上的静态也意味着它是类定义的属性,您可以在没有实例的情况下访问和使用它。
答案 1 :(得分:2)
顶级课程的可见性可以是公开的或包装的;但嵌套静态类的可见性也可以是私有的或受保护的。
声明嵌套类还可以改进类的打包(结构化)并关联它们的依赖关系,例如Map.Entry
。虽然,它也可能是模糊的。
单词static
具有在类级别声明实例的含义。例如,static int i
为类声明一个整数。顶级类与声明类级别的类相同是相同的。
答案 2 :(得分:1)
我可以解决你的第二个问题。
Some other keywords have overloaded meanings,因此static
示例不是唯一的。 static
甚至在静态导入的上下文中有另一种含义。它正在重复使用你已经熟悉过的另一种情况,即使它具有完全不同的含义,它也是有意义的。
例如,final
可用于标识只能一次初始化的变量。它还有其他含义,比如识别无法覆盖的方法。
super
和synchronized
也用于多种情况。
答案 3 :(得分:1)
- 这就是理论,任何人都可以想到一个很好的实际例子,为什么我们需要这样做? (链接中的示例很可能是内部类AFAIK的示例。)
醇>
这样做有助于垃圾收集。非静态内部类包含对外部类的引用。
例如:如果你有一个庞大的外部类,它在某个任务列表中创建一个Runnable队列,那么Runnable的存在可能成为唯一阻止它被收集的东西。现在,内部类强制JVM保留一堆无用的堆空间,它可能必须移出伊甸园并进入更难收集的幸存者空间。
- 另外 - 问题背后的原因 - 为什么要有一个含糊不清的名字,为什么“重复使用”>这个词静态并给它一个不同的含义?
醇>
您更喜欢称之为什么?在语言方面,使用静态不会导致语法中的任何歧义。对我来说,“静态”是有道理的。内部类的实例不是外部类实例的成员,反之亦然。
答案 4 :(得分:1)
这些上下文中static
的共享含义是“在编译时可解析”(而不是必须在对象实例上查找它们并通过虚拟方法表)。这适用于静态方法,静态变量和静态内部类。我认为当编译器编写者选择你的语言关键词时会发生这种情况,概念上他将它们组合在一起作为“我可以优化的东西”。