Java “static关键字对类声明的作用与对变量或方法声明的作用不同。”

Java “static关键字对类声明的作用与对变量或方法声明的作用不同。”,java,static,inner-classes,nested-class,Java,Static,Inner Classes,Nested Class,发件人: 我理解static只能与嵌套类一起使用,这使得它们相当于顶级类。我还理解,这使它们能够独立于封闭类进行声明 这就是理论,有人能想出一个好的实际例子来解释为什么我们需要这样做吗?链接中的示例很可能是内部类AFAIK 还有——问题背后的原因——为什么有一个模棱两可的名字,为什么重用static这个词并赋予它不同的含义 我可以回答你的第二个问题 ,因此静态示例不是唯一的。在静态导入的上下文中,static甚至还有另一个含义。这是在另一种情况下重复使用一个你已经熟悉的词,即使它有完全不同的含义

发件人:

我理解static只能与嵌套类一起使用,这使得它们相当于顶级类。我还理解,这使它们能够独立于封闭类进行声明

这就是理论,有人能想出一个好的实际例子来解释为什么我们需要这样做吗?链接中的示例很可能是内部类AFAIK

还有——问题背后的原因——为什么有一个模棱两可的名字,为什么重用static这个词并赋予它不同的含义


我可以回答你的第二个问题

,因此静态示例不是唯一的。在静态导入的上下文中,static甚至还有另一个含义。这是在另一种情况下重复使用一个你已经熟悉的词,即使它有完全不同的含义,也能有意义

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


super和synchronized也用于多种上下文。

我可以回答您的第二个问题

,因此静态示例不是唯一的。在静态导入的上下文中,static甚至还有另一个含义。这是在另一种情况下重复使用一个你已经熟悉的词,即使它有完全不同的含义,也能有意义

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

super和synchronized也在多个上下文中使用

这就是理论,有人能想出一个好的实际例子来解释我们为什么需要这么做吗?链接中的示例很可能是内部类AFAIK。 这样做有助于垃圾收集。非静态内部类包含对外部类的引用

例如:如果您有一个很大的外部类,它在某个任务列表中创建了一个可运行队列,那么该可运行队列的存在可能成为阻止收集它的唯一原因。现在,内部类正迫使JVM保留一块无用的堆空间,它可能不得不将其移出eden并转移到更难收集的幸存者空间

还有-问题背后的原因-为什么有一个模棱两可的名字,为什么重用>静态这个词并赋予它不同的含义? 你想叫它什么?就语言而言,使用static不会在语法上造成任何歧义。对我来说,静态是有意义的。内部类的实例不是外部类实例的成员,反之亦然

这就是理论,有人能想出一个好的实际例子来解释我们为什么需要这么做吗?链接中的示例很可能是内部类AFAIK。 这样做有助于垃圾收集。非静态内部类包含对外部类的引用

例如:如果您有一个很大的外部类,它在某个任务列表中创建了一个可运行队列,那么该可运行队列的存在可能成为阻止收集它的唯一原因。现在,内部类正迫使JVM保留一块无用的堆空间,它可能不得不将其移出eden并转移到更难收集的幸存者空间

还有-问题背后的原因-为什么有一个模棱两可的名字,为什么重用>静态这个词并赋予它不同的含义?
你想叫它什么?就语言而言,使用static不会在语法上造成任何歧义。对我来说,静态是有意义的。内部类的实例不是外部类实例的成员,反之亦然。

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

Map.Entry的实现就是一个很好的例子。将其嵌套在映射实现中显然是“自然的”,但不需要将父引用保留回映射

对于2,有什么不同?字段或方法上的静态表示它是类定义的属性,而不是实例。您可以在没有实例的情况下访问和使用它。嵌套类上的静态也意味着它是类定义的属性,您可以在没有实例的情况下访问和使用它p> 当类是自然嵌套的,但不需要内部类在Java中具有的auto-magic$this父引用时,可以使用它。每个非静态内部类都有一个对其包含实例的嵌入式引用。当您实际上不需要该引用时,最好不要创建它。这可能会导致对象在内存中停留的时间比它们需要的时间长得多,而且当您开始序列化对象/尝试通过网络发送对象等时,这也可能是一件痛苦的事情。最终,您可能会得到一个比您预期的或序列化所需的大得多的对象图

Map.Entry的实现就是一个很好的例子。将其嵌套在映射实现中显然是“自然的”,但不需要将父引用保留回映射

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

顶级课程的可视性可以是公开的,也可以是打包的;但是嵌套静态类的可见性也可能是私有的或受保护的。 声明嵌套类还可以改进类的打包结构并关联它们的依赖项,如Map.Entry。虽然,它也可能是友好的

单词static的意思是在类级别声明实例。例如,static int i为一个类声明一个整数。顶级类与在类级别声明类相同

顶级课程的可视性可以是公开的,也可以是打包的;但是嵌套静态类的可见性也可能是私有的或受保护的。 声明嵌套类还可以改进类的打包结构并关联它们的依赖项,如Map.Entry。虽然,它也可能是友好的

单词static的意思是在类级别声明实例。例如,static int i为一个类声明一个整数。顶级类与在类级别声明类相同


在这些上下文中,静态的共同含义是“可在编译时解析”,而不是必须在对象实例上查找它们并遍历虚拟方法表。这适用于静态方法、静态变量和静态内部类。我认为,当编译器编写者选择您的语言关键字时,就会发生这种情况,从概念上讲,他会将这些关键字分组为“我可以优化的内容”。

这些上下文中的静态共享含义是“可在编译时解析的”,而不是必须在对象实例上查找它们并遍历虚拟方法表。这适用于静态方法、静态变量和静态内部类。我认为这就是当编译器编写者选择您的语言关键字时会发生的情况,从概念上讲,他将它们都分组为“我可以优化的内容”。

谢谢-我不知道这是一件非常常见的事情!谢谢-我不知道这是一件很平常的事!2-从这个角度看,是的,这确实很有意义。非常感谢。1-地图。输入是一个很好的例子,有趣的是我没有想到:再次感谢!2-从这个角度看,是的,这确实很有意义。非常感谢。1-地图。输入是一个很好的例子,有趣的是我没有想到:再次感谢!