gpt4 book ai didi

java - 枚举 - 静态和实例 block

转载 作者:太空宇宙 更新时间:2023-11-04 11:57:54 25 4
gpt4 key购买 nike

我了解到,在Java中,静态 block 在类初始化时执行,实例 block 在类的每个实例构造之前执行。我总是看到静态 block 在实例 block 之前执行。为什么枚举的情况相反?

任何人都可以向我解释一下示例代码的输出吗:

enum CoffeeSize {

BIG(8), LARGE(10),HUGE(12),OVERWHELMING();
private int ounces ;

static {
System.out.println("static block ");
}
{
System.out.println("instance block");
}

private CoffeeSize(int ounces){
this.ounces = ounces;
System.out.println(ounces);
}
private CoffeeSize(){
this.ounces = 20;
System.out.println(ounces);
}

public int getOunces() {
return ounces;
}
}

输出:

实例 block
8
实例 block
10
实例 block
12
实例 block
20
静态 block

最佳答案

您需要知道枚举值是保存该枚举类型实例的静态字段,静态字段的初始化顺序取决于它们的位置。请参阅此示例

class SomeClass{
public SomeClass() { System.out.println("creating SomeClass object"); }
}

class StaticTest{
static{ System.out.println("static block 1"); }
static SomeClass sc = new SomeClass();
static{ System.out.println("static block 2"); }

public static void main(String[] args) {
new StaticTest();
}
}

输出

static block 1
creating SomeClass object
static block 2

现在,由于枚举值始终放置在枚举类型的开头,因此它们将始终在任何静态初始化 block 之前被调用,因为其他所有内容都只能在枚举值之后声明。
但是枚举值的初始化(在类初始化时发生)会调用它们的构造函数,并且正如您所说,非静态初始化 block 在每个构造函数开始时执行,这就是您看到它们的原因:

  • 对于每个枚举值
  • 以及任何静态初始化 block 之前。

关于java - 枚举 - 静态和实例 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41191643/

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