【发布时间】:2017-06-22 18:56:19
【问题描述】:
我想问一个关于类和“机制”的问题,Java 通过它将它们加载到内存中,特别是关于静态字段和方法的创建。
一个类可能有静态字段和方法,可以在加载时从该类本身调用,而无需创建该类的实例。它是怎么发生的??它背后的“机制”是什么?
我知道当 JVM 需要加载一个类时,它会创建一个类对象,其中包含有关如何创建相应类的实例的元数据。但是,当静态字段和方法也被加载时,它们是否分配给类对象,例如,作为回报,它为每个创建的新实例创建它们的引用?这是否解释了如何从类(在面向对象的语言中可能意味着什么)以及它的每个实例中调用静态方法?无论我多么努力地用谷歌搜索它,我都找不到关于在这个特定问题上如何运作的答案。
最重要的是,有谁知道为什么 Java 允许从实例以及“类本身”访问静态字段?我的意思是什么概念。
在此先感谢大家的宝贵时间。
【问题讨论】:
-
它们存储在内存中,就像任何其他内存一样。
-
来自实例的引用静态数据只是编译器的愚蠢行为,与运行时无关。
-
每个对象都有一个对其自己类的引用,它通过该引用获取静态项,而不是通过对每个静态项的额外引用。这也是为什么从对象引用中引用静态的原因。这不仅仅是“编译器愚蠢”(@SLaks)。这实际上是不可避免的。
-
@EJP:不;写
new Foo().someStaticMethod()是纯语法糖。 -
@SLaks 使用引用会打开它所引用的类的整个范围。为此目的从该范围中删除静态将需要额外的工作。它不需要更多的工作。它不是“语法糖”。
标签: java class static-methods