gpt4 book ai didi

java - 枚举 - 静态和实例 block

转载 作者:IT老高 更新时间:2023-10-28 21:08:30 28 4
gpt4 key购买 nike

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

谁能解释一下示例代码的输出:

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/11419519/

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