【问题标题】:Java's enum... Where are they created?Java 枚举...它们是在哪里创建的?
【发布时间】:2011-04-09 07:11:15
【问题描述】:

由于 C# 中的枚举在堆栈上,我想知道枚举在 Java 中的创建位置。在堆栈上?在堆上?在另一个神秘的地方?

C# 中的枚举比 Java 中的更原始,这或许可以解释为什么它们是在堆栈上创建的...

他们在哪里?我找不到他们!

谢谢

【问题讨论】:

  • C# 中的枚举可以在堆栈上,但它们也可以在堆上。这一切都取决于它们的使用位置(字段/参数/局部变量)。虽然它们是值类型,但也许这就是混乱的来源?此外,在 .NET 中,变量内容的存储位置无关紧要。这只是一个实现细节(可能会在 CLR 的不同实现中发生变化)。
  • 出于好奇,您为什么想知道它们是在堆栈上还是在堆上?
  • @whaley 简单的好奇心
  • 它们在堆上,这只是 Java 在性能方面如此糟糕的另一个原因。

标签: java c# enums heap-memory stack-memory


【解决方案1】:

Java 中的枚举也是对象:例如,枚举可以具有实例变量/方法/构造函数并实现接口。这一切让我觉得它们就像 jvm 处理的其他对象一样。

【讨论】:

  • 这意味着......他们在堆上。
【解决方案2】:

由于 Java 枚举 extendjava.lang.Enum,它们像所有其他 Java 对象一样在堆上创建。

【讨论】:

  • 从技术上讲,它们确实扩展了Enum。但正是它们作为对象的状态(即:它们也间接扩展了Object)使它们成为引用类型。
  • @0xA3:它们扩展 java.lang.Enum,而 java.lang.Enum 本身扩展了 java.lang.Object
  • 不,0xA3,我的意思是我说的。查看我发布的 javadocs 链接。它们扩展了 java.lang.Enum,而后者又扩展了 java.lang.Object。
【解决方案3】:

它们是对象,就像任何其他对象一样,所以枚举本身就在堆上。持有对枚举的引用的变量如果是函数变量,则可能位于堆栈上;如果它是对象的成员,则可能位于其他对象内部的堆上。

【讨论】:

    【解决方案4】:

    枚举是 Java 中的对象,因此它们位于堆上。但是,对于每种类型,它们只有固定数量。 客户端代码正在处理对这些枚举对象的引用,因此实际上不会在堆上创建任何内容。从规范的角度来看:局部变量引用在堆栈上;对象字段引用在堆上。

    【讨论】:

    • 第一句 - “所以它们在堆栈上” - 我想你的意思是输入“所以它们在堆上”;)
    • @serg10 是的。也不想要那个#。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-25
    • 1970-01-01
    • 2012-09-26
    相关资源
    最近更新 更多