gpt4 book ai didi

java - Java 枚举实例的生命周期

转载 作者:搜寻专家 更新时间:2023-10-31 19:45:10 27 4
gpt4 key购买 nike

我知道枚举类型的每个预定义常量都有一个实例。是这样吗?现在,假设枚举有一个名为 value 的实例变量,并且假设 ONE 是一个预定义常量。如果为 ONE 的实例修改了 value,那么这会影响引用 ONE 的所有变量。但是,当垃圾收集器清除枚举的所有实例时,value 的值会发生什么变化?他们甚至被扔掉了吗?

示例

这是一个简单的例子,其中有两个变量 AB,都指向 ONEvalue 的值在B 第一次使用前被取反。如果垃圾收集器在 Number B = Number.ONE; 行之前清除了 ONE 的实例,那么 value 的值将已经“重置”回 1,我想。这是正确的吗?

枚举:

public enum Number
{
ONE(1), TWO(2), THREE(3);

int value;

Number(int value) { this.value = value; }

void negate() { value = -value; }

@Override
public String toString() { return "value: " + value; }
}

主要方法:

public static void main(String[] args)
{
Number A = Number.ONE;
A.negate();
Number B = Number.ONE;

System.out.println(A + " " + B);
}

输出:

value: -1 value: -1

所以我的问题是,输出是否可以是以下内容(如果在使用 B 之前添加 A = null;)?

value: -1 value: 1

最佳答案

枚举是隐式的 public static final 字段,因此它们永远不会被垃圾回收。

编辑

正如@RealSkeptic 在评论中友好指出的那样,在具有多个类加载器的 jvm 实例中,事情要复杂一些。那么静态字段值可能会在它们的 classes are unloaded 消失时消失。 .

但是,默认情况下,只要 jvm 实例处于 Activity 状态,就只有一个类加载器处于 Activity 状态,因此在您的示例应用程序中,静态字段永远不会被垃圾回收。

关于java - Java 枚举实例的生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31356845/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com