当前位置: 首页 > 面试题库 >

枚举-静态块和实例块

韦嘉颖
2023-03-14
问题内容

我已经了解到,在Java中,静态类在初始化类时执行,实例块在构造类的每个实例之前执行。我一直看到静态块要在实例块之前执行。为什么情况相反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;
    }
}

输出:

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


问题答案:

您需要知道枚举值是保存该枚举类型实例的静态字段,并且静态字段的初始化顺序取决于它们的位置。看这个例子

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

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

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


 类似资料:
  • 问题内容: Java中的静态和非静态枚举有什么区别?两种用法是相同的。 正确吗 所有静态的都在启动时加载到内存中,非静态的则按需加载 ? 如果是,那么哪种方法更好?将某些数据始终保留在内存中还是每次使用服务器资源加载它们? 问题答案: 所有的都是有效的。如果您有嵌套的枚举,则它与相同。 所有类都是延迟加载的(枚举或其他),但是在加载时,它们会一次全部加载。也就是说,您不能加载一些常量,而不能加载其

  • 问题内容: 我正在查看公司其他部门维护的一些Java代码,顺便说一下,这是一些前C和C ++开发人员所维护的。普遍存在的一件事是使用静态整数常量,例如 除了缺少“最终”限定符外,这种代码也让我有些不安。我本来希望看到的是,从学校开始主要接受Java的培训,这会更像 但是,论点使我失望。为什么要比后者更好呢? 问题答案: 为什么要比后者更好呢? 这样做要好得多,因为它可以为您提供类型安全性并具有自记

  • 我遇到了一些jackson多态问题。 我工作在一个web JDR字符编辑器个人项目。我使用springboot并试图坚持哲学。此外,我尝试做一些独立的包,因为学习案例为我的真正工作(另一个springboot项目)。 没有jackson配置,我没有问题序列化一个能力。但是当我试图恢复web编辑器上的任何修改时,所以当jackson对一个能力进行反序列化时,“dependance”属性就会出现问题。

  • 问题内容: 考虑我有以下枚举类, 在下面的课程中,我试图测试枚举类, 在这里,我指定然后将其作为参数传递给方法。相反,如果我们要实例化枚举类并将其作为参数传递,我们需要做什么? 问题答案: 在这里,我需要指定Sample.READ以将其作为参数传递。相反,如果我们要实例化枚举类并将其作为参数传递,我们需要做什么? “实例化枚举类”甚至意味着什么?枚举的要点是有一组 固定 的值-您以后不能创建更多值

  • 问题内容: 这来自有效的Java: 请注意,操作常量是从创建常量之后运行的静态块放入stringToEnum映射中的。试图使每个常量从其自己的构造函数中放入映射中将导致编译错误。这是一件好事,因为如果合法,它将导致NullPointerException。除编译时常量字段外,不允许枚举构造函数访问枚举的静态字段。此限制是必需的,因为在构造函数运行时尚未初始化这些静态字段。 我的问题是关于这条线的: