【问题标题】:Ownership of static fields & methods in JavaJava中静态字段和方法的所有权
【发布时间】:2017-06-22 18:56:19
【问题描述】:

我想问一个关于类和“机制”的问题,Java 通过它将它们加载到内存中,特别是关于静态字段和方法的创建。

一个类可能有静态字段和方法,可以在加载时从该类本身调用,而无需创建该类的实例。它是怎么发生的??它背后的“机制”是什么?

我知道当 JVM 需要加载一个类时,它会创建一个类对象,其中包含有关如何创建相应类的实例的元数据。但是,当静态字段和方法也被加载时,它们是否分配给类对象,例如,作为回报,它为每个创建的新实例创建它们的引用?这是否解释了如何从类(在面向对象的语言中可能意味着什么)以及它的每个实例中调用静态方法?无论我多么努力地用谷歌搜索它,我都找不到关于在这个特定问题上如何运作的答案。

最重要的是,有谁知道为什么 Java 允许从实例以及“类本身”访问静态字段?我的意思是什么概念。

在此先感谢大家的宝贵时间。

【问题讨论】:

  • 它们存储在内存中,就像任何其他内存一样。
  • 来自实例的引用静态数据只是编译器的愚蠢行为,与运行时无关。
  • 每个对象都有一个对其自己类的引用,它通过该引用获取静态项,而不是通过对每个静态项的额外引用。这也是为什么从对象引用中引用静态的原因。这不仅仅是“编译器愚蠢”(@SLaks)。这实际上是不可避免的。
  • @EJP:不;写new Foo().someStaticMethod() 是纯语法糖。
  • @SLaks 使用引用会打开它所引用的类的整个范围。为此目的从该范围中删除静态将需要额外的工作。它不需要更多的工作。它不是“语法糖”。

标签: java class static-methods


【解决方案1】:

我认为您的意思是类加载和链接的概念。这里解释的很好jvmspec

特别是部分

5.3。创建和加载

您可能还想查看jvm architecture 。它可以更好地理解用于存储类级别信息(例如静态变量和方法)的方法区域。

【讨论】:

  • 也许我问得不对。当创建一个类的对象时,它的字段与它“关联”,因此它们被称为如下:myobj.field。但是,当一个类被加载时,它的静态字段和方法也会被加载,而不会创建任何对象。那么,在面向对象编程中,当我们编写 MyClass.static_field 时,on memory 的类是什么,从中调用静态字段?类是一个蓝图,JVM 从中创建一个“类 obj”以包含未来实例的元数据。那么,什么是称为 FROM 的静态字段?这就是问题
  • (续)我的意思是,对象是 RAM 上的一个结构,其中包含其字段和方法。 RAM 上的课程是什么?它不是像对象那样的结构,可以从中调用它的(静态)字段,那么 MyClass.static_field 的含义是什么??
  • @VBent 类 Class 的实例表示正在运行的 Java 应用程序中的类和接口。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-19
  • 1970-01-01
  • 1970-01-01
  • 2020-11-12
  • 1970-01-01
  • 2022-10-23
相关资源
最近更新 更多