“static关键字不对类声明做什么,它对变量或方法声明做了什么。”

时间:2011-02-15 18:25:07

标签: java static inner-classes nested-class

来自:JavaWorld

我理解static只能与嵌套类一起使用,这使它们等同于顶级类。我也理解这可以使它们独立于封闭类声明。

  1. 这就是理论,任何人都可以想到一个很好的实际例子,说明为什么我们需要这样做? (链接中的示例很可能是内部类AFAIK的示例。)

  2. 此外 - 问题背后的原因 - 为什么有一个含糊不清的名称,为什么“重复使用”单词static并给它一个不同的含义?

5 个答案:

答案 0 :(得分:4)

当您的类自然嵌套时使用它,但不需要内部类在Java中使用的auto-magic $ this父引用。每个非静态内部类都包含对其包含实例的嵌入式引用。当您实际上不需要该引用时,最好不要创建它。它可能导致对象在内存中停留的时间比它们需要的时间长得多,当你开始序列化对象/尝试通过网络发送它们时,它也会很痛苦。你最终可能会得到比你更大的对象图。预期或需要序列化!

Map.Entry的实现就是一个很好的例子。它嵌套在地图实现中显然是“自然的”,但是没有必要真正将父引用保存回地图。

对于#2,它有什么不同?字段或方法上的静态意味着它是类定义的属性而不是实例。您无需实例即可访问和使用它。嵌套类上的静态也意味着它是类定义的属性,您可以在没有实例的情况下访问和使用它。

答案 1 :(得分:2)

  1. 顶级课程的可见性可以是公开的或包装的;但嵌套静态类的可见性也可以是私有的或受保护的。 声明嵌套类还可以改进类的打包(结构化)并关联它们的依赖关系,例如Map.Entry。虽然,它也可能是模糊的。

  2. 单词static具有在类级别声明实例的含义。例如,static int i为类声明一个整数。顶级类与声明类级别的类相同是相同的。

答案 2 :(得分:1)

我可以解决你的第二个问题。

Some other keywords have overloaded meanings,因此static示例不是唯一的。 static甚至在静态导入的上下文中有另一种含义。它正在重复使用你已经熟悉过的另一种情况,即使它具有完全不同的含义,它也是有意义的。

例如,final可用于标识只能一次初始化的变量。它还有其他含义,比如识别无法覆盖的方法。

supersynchronized也用于多种情况。

答案 3 :(得分:1)

  
      
  1. 这就是理论,任何人都可以想到一个很好的实际例子,为什么我们需要这样做? (链接中的示例很可能是内部类AFAIK的示例。)
  2.   

这样做有助于垃圾收集。非静态内部类包含对外部类的引用。

例如:如果你有一个庞大的外部类,它在某个任务列表中创建一个Runnable队列,那么Runnable的存在可能成为唯一阻止它被收集的东西。现在,内部类强制JVM保留一堆无用的堆空间,它可能必须移出伊甸园并进入更难收集的幸存者空间。

  
      
  1. 另外 - 问题背后的原因 - 为什么要有一个含糊不清的名字,为什么“重复使用”>这个词静态并给它一个不同的含义?
  2.   

您更喜欢称之为什么?在语言方面,使用静态不会导致语法中的任何歧义。对我来说,“静态”是有道理的。内部类的实例不是外部类实例的成员,反之亦然。

答案 4 :(得分:1)

这些上下文中static的共享含义是“在编译时可解析”(而不是必须在对象实例上查找它们并通过虚拟方法表)。这适用于静态方法,静态变量和静态内部类。我认为当编译器编写者选择你的语言关键词时会发生这种情况,概念上他将它们组合在一起作为“我可以优化的东西”。