为什么枚举中的静态和实例初始化块的行为与类中的行为不同

2024-03-31

在学习 Java 认证测试时,我了解到静态初始化块在加载类时按照源代码中出现的顺序运行一次,实例初始化块在每次创建实例时运行,并且构造函数中的代码每次运行之后创建一个实例。为了测试我创建了一个带有一些静态和实例初始化块的类以及一个带有打印内容的构造函数。一切都按预期工作——除了我认为“已加载”意味着仅在运行时,但我猜它在创建第一个实例时发生,因为除非我创建该类的至少一个实例,否则我根本不会得到任何输出。然后我用枚举尝试了同样的操作,订单全部关闭。首先,当在代码中第一次引用枚举时,初始化块针对枚举具有的每个值运行一次,其次——初始化块在我假设的实例初始化块之后标记为静态运行!这与我的预期相反。这是我的问题的细分。

  1. 为什么标记为静态的 init 块在枚举中最后运行?
  2. 枚举可以有实例初始化块吗?
  3. 为什么我认为是实例初始化块的块仅在加载枚举时运行一次,而不是每次引用新的枚举值时运行?
  4. 类静态初始化块在“加载”类时运行。已加载是什么意思?当一个对象在类中实例化时,它只发生一次吗?

谢谢!这让我很困惑。

public class EnumInit {
public static void main(String[] args) {
    System.out.println(Color.RED.toString() + " Main");
    MyInit myInit = new MyInit();
    System.out.println(Color.BLUE.toString() + " Main");
    MyInit mySecondInit = new MyInit();

}
}

enum Color {    
RED, BLUE, GREEN;
String instanceVar = "Enum Instance Variable Text";
static { System.out.println("Enum Static init block 1"); }
{ System.out.println("Enum Instance init block 1"); }
static { System.out.println("Enum Static static init block 2"); }
Color() { 
    System.out.println(instanceVar);
    System.out.println("Enum String Literal"); 
}
{ System.out.println("Enum Instance init block 2"); }   
}

class MyInit {
String instanceVar = "Class Instance Variable Text";
static { System.out.println("Class Static init block 1"); }
{ System.out.println("Class Instance init block 1"); }
static { System.out.println("Class Static static init block 2"); }
MyInit() { 
    System.out.println(instanceVar);
    System.out.println("Class String Literal"); 
}
{ System.out.println("Class Instance init block 2"); }  
}

The Java 语言规范是这样描述的enum常量 http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.9.2

除了枚举类型 E 继承自 Enum 的成员之外,对于每个声明的名为 n 的枚举常量,枚举类型都有一个 隐式声明名为 n 的 E 类型公共静态最终字段。这些 字段被认为是按照与 相应的枚举常量,在任何静态字段显式之前 在枚举类型中声明。每个这样的字段都被初始化为枚举 与其对应的常数。

So

enum Color {    
    RED, BLUE, GREEN;
    ...
}

实际上是

public static final Color RED = new Color();
public static final Color BLUE = new Color();
public static final Color GREEN = new Color();

这将在之前得到评估static你拥有的方块。

为什么标记为静态的 init 块在枚举中最后运行?

往上看。

枚举可以有实例初始化块吗?

是的,编译你的代码,你就会看到。

为什么我认为是实例初始化块的块仅在加载枚举时运行一次,而不是每次引用新的枚举值时运行?

枚举类型初始化后,就会创建(实例化)枚举常量。你不创建一个新的enum任何时候你这样做

Color color = Color.RED;

您只是引用一个已经创建的现有对象。

类静态初始化块在“加载”类时运行。已加载是什么意思?当一个对象在类中实例化时,它只发生一次吗?

当一个类第一次在 JVM 中被引用时,它会被加载ClassLoader并初始化。在这里阅读更多相关信息。 https://stackoverflow.com/questions/3499214/java-static-class-initialization

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么枚举中的静态和实例初始化块的行为与类中的行为不同 的相关文章

  • 在 mvn 命令中指定 pom.xml 并混合其他项目的目标

    我有多个问题 我可以在 mvn 命令中指定 pom xml 吗 在当前项目上执行 mvn 命令时 我可以混合另一个项目的目标吗 例如 mvn clean otherproject comple otherproject install ot
  • 如何在 Firebase 远程配置中从 JSON 获取值

    我是 Android 应用开发和 Firebase 的新手 我想知道如何获取存储在 Firebase 远程配置中的 JSONArray 文件中的值 String 和 Int 我使用 Firebase Remote Config 的最终目标是
  • “java.net.MalformedURLException:未找到协议”读取到 html 文件

    我收到一个错误 java net MalformedURLException Protocol not found 我想读取网络上的 HTML 文件 mainfest uses permission android name android
  • 如何在 Antlr4 中为零参数函数编写语法

    我的函数具有参数语法 如下面的词法分析器和解析器 MyFunctionsLexer g4 lexer grammar MyFunctionsLexer FUNCTION FUNCTION NAME A Za z0 9 DOT COMMA L
  • 不同类型的数组

    是否可以有一个包含两种不同类型数据的数组 我想要一个包含双精度型和字符串的数组 我尝试过 ArrayList
  • GWT - 如何组织项目以拥有多个网页以及它们之间的导航

    我是 GET 的新手 顺便说一句 它给我留下了深刻的印象 并且发现它对于像我这样熟悉 C NET 桌面技术并愿意编写 Web 应用程序的人来说非常有吸引力 我根据 GWT Eclipse 向导生成的示例启动了自己的项目 该项目生成带有面板的
  • 通往楼梯顶部的可能路径

    这是一个非常经典的问题 我听说谷歌在他们的面试中使用过这个问题 问题 制定一个递归方法 打印从楼梯底部到楼梯顶部的所有可能的独特路径 有 n 个楼梯 您一次只能走 1 步或 2 步 示例输出 如果它是一个有 3 级楼梯的楼梯 1 1 1 2
  • 在 Wildfly 中与 war 部署共享 util jar 文件

    假设我有一个名为 util jar 的 jar 文件 该 jar 文件主要包含 JPA 实体和一些 util 类 无 EJB 如何使这个 jar 可用于 Wildfly 中部署的所有 war 无需将 jar 放置在 war 的 WEB IN
  • 当客户端关闭连接时,Spring StreamingResponseBody 请求线程未清理

    我在控制器中有一个端点 它返回一个StreamingResponseBody 用于向客户端发送文件 其代码大致如下 RestController RequestMapping value api public class Controlle
  • Spring Security SAML2 使用 G Suite 作为 Idp

    我正在尝试使用 Spring Security 5 3 3 RELEASE 来处理 Spring Boot 应用程序中的 SAML2 身份验证 Spring Boot 应用程序将成为 SP G Suite 将成为 IDP 在我的 Maven
  • 如何使用 Hibernate (EntityManager) 或 JPA 调用 Oracle 函数或过程

    我有一个返回 sys refcursor 的 Oracle 函数 当我使用 Hibernate 调用该函数时 出现以下异常 Hibernate call my function org hibernate exception Generic
  • 如何避免 ArrayIndexOutOfBoundsException 或 IndexOutOfBoundsException? [复制]

    这个问题在这里已经有答案了 如果你的问题是我得到了java lang ArrayIndexOutOfBoundsException在我的代码中 我不明白为什么会发生这种情况 这意味着什么以及如何避免它 这应该是最全面的典范 https me
  • 内部存储的安全性如何?

    我需要的 对于 Android 我需要永久保存数据 但也能够编辑 并且显然是读取 它 用户不应访问此数据 它可以包含诸如高分之类的内容 用户不得对其进行编辑 我的问题 我会 并且已经 使用过Internal Storage 但我不确定它实际
  • 流中的非终结符 forEach() ?

    有时 在处理 Java Stream 时 我发现自己需要一个非终端 forEach 来触发副作用但不终止处理 我怀疑我可以用 map item gt f item 之类的方法来做到这一点 其中方法 f 执行副作用并将项目返回到流中 但这似乎
  • 在 SWT/JFace RCP 应用程序中填充巨大的表

    您将如何在 SWT 表中显示大量行 巨大是指超过 20K 行 20 列的东西 不要问我为什么需要展示那么多数据 这不是重点 关键是如何让它尽可能快地工作 这样最终用户就不会厌倦等待 每行显示某个对象的实例 列是其属性 一些 我想使用 JFa
  • 返回 Java 8 中的通用函数接口

    我想写一种函数工厂 它应该是一个函数 以不同的策略作为参数调用一次 它应该返回一个函数 该函数根据参数选择其中一种策略 该参数将由谓词实现 嗯 最好看看condition3为了更好的理解 问题是 它没有编译 我认为因为编译器无法弄清楚函数式
  • 在 Google App-Engine JAVA 中将文本转换为字符串,反之亦然

    如何从字符串转换为文本 java lang String to com google appengine api datastore Text 反之亦然 Check Javadoc http code google com appengin
  • 使用按钮作为列表的渲染器

    我想使用一个更复杂的渲染器 其中包含列表的多个组件 更准确地说 类似于this https stackoverflow com questions 10840498 java swing 1 6 textinput like firefox
  • 如何使用play框架上传多个文件?

    我在用play framework 2 1 2 使用java我正在创建视图来上传多个文件 我的代码在这里 form action routes upload up enctype gt multipart form data
  • 洪水填充优化:尝试使用队列

    我正在尝试创建一种填充方法 该方法采用用户指定的初始坐标 检查字符 然后根据需要更改它 这样做之后 它会检查相邻的方块并重复该过程 经过一番研究 我遇到了洪水填充算法并尝试了该算法 它可以工作 但无法满足我对 250 x 250 个字符的数

随机推荐

  • 如何管理 Workflow Foundation 中的版本?

    当您有长时间运行的工作流并且持久性存储中可能同时有两个或三个版本并且必须能够访问所有版本时 如何管理 WF 中的工作流版本 我撰写了一系列 4 篇博客文章 涵盖了对长期运行的工作流程进行版本控制时需要注意的大部分内容 我倾向于避免的一件事是
  • 在设备上打印视图层次结构

    在我无法实际访问的三星手机上调试我的应用程序 结果出现奇怪的结果 我想要求用户运行一个已检测的应用程序来帮助调试 我的应用程序获得view其中有一个未知的 对我来说 层次结构 ViewGroupsETC 有没有办法 走路 View并打印出一
  • sencha列表分页插件

    我正在尝试使用 sencha touch 的列表分页插件 但几乎没有关于如何使用它的好 或坏 文档 我很困惑 当我激活列表中的插件时 this myList new Ext List store this myStore plugins p
  • 在 vim 中反转逗号分隔列表的最快方法是什么?

    我经常必须更正以下 Rails 代码 assert equal value expected assert equal 的两个参数是乱序的 应该是 assert equal expected value 在vim中 从第一行到第二行最有效的
  • 如何使用 C++ 初始化 const char 数组数据成员?

    我有一个与 C 类成员初始化相关的问题 下面的代码说明了我的问题 class ABCD public ABCD ObjNum 3 ABCD static const unsigned char getByte 8 const int Obj
  • 获取不包含滚动条宽度的 Div 宽度

    我这里有个问题 这里有两个div div1 和 div2 这里我想根据 div2 宽度调整 div1 宽度 我的要求是 div1 不应包含滚动条的宽度 即我应该设置 div1 的高度 不包括 div2 中滚动条的宽度 我想要一个 jquer
  • 如何将目录中每个文件中的制表符转换为空格?

    如何将目录中每个文件中的制表符转换为空格 可能递归地 另外 有没有办法设置每个选项卡的空格数 简单替换为sed可以 但不是最好的解决方案 如果选项卡之间存在 额外 空格 则它们在替换后仍将存在 因此边距将参差不齐 在行中间展开的选项卡也将无
  • 什么是方法内联? [复制]

    这个问题在这里已经有答案了 我一直试图理解这真正意味着什么 内联函数 在 C 中 定义的成员函数 类声明 2 函数 调用编译器替换为 该函数的实际代码 这 关键字 inline 可用于提示 编译器执行内联 成员身体的扩张或 非成员函数 in
  • 我可以在为 kindle fire 商店发布的应用程序中使用 Google Analytics 吗?

    我目前在 Play 商店中有一个使用谷歌分析的应用程序 我想修改并发布该应用程序到 Kindle 应用程序商店 并且仍然能够使用 GA 据我了解 这取决于播放服务能否正常工作 显然 kindle 设备上没有播放服务 但有没有办法将它们包含在
  • 将 ZeroMQ 交叉编译为 ARM,以便在 MonoTouch iPhone 应用程序配置设置中使用

    我正在尝试在使用 MonoTouch 用 C 开发的 iPhone 应用程序中使用 ZeroMQ 库 我几乎解决了所有的问题 却在最后一道坎倒下了 我正在使用 ZeroMQ 2 1 10 和 C CLR 绑定 包装器 并在 Mac OS X
  • 为什么默认字符串比较器无法保持传递一致性?

    我知道这个问题之前已经注意到 https stackoverflow com questions 9354966 string sorting issue in c sharp 9355086 9355086 或多或少简洁 但我仍然创建这个
  • 在 Google Colab 上设置 MLflow

    我经常使用 Google Colab 来训练 TF PyTorch 模型 因为 Colab 为我提供了 GPU TPU 运行时 此外 我喜欢使用 MLflow 来存储和比较经过训练的模型 跟踪进度 共享等 将 MLflow 与 Google
  • 如何在UITableView中显示滚动条

    我想显示某种指示来引导用户滚动 通常 当我们触摸 UITableView 时 如果需要 滚动条就会出现 但我希望这个滚动条指示已经显示在我的表格视图上 怎么可能这样做呢 如果您有一个超出屏幕的表格视图 您可以调用 self tableVie
  • 使用持久登录 Cookie 时,如何根据数据库中的 bcrypt-hashed 令牌检查 Cookie 令牌?

    In 这个流行的解决方案 https stackoverflow com a 477578 869849对于涉及生成随机 128 位 令牌 以保存在用户 Cookie 中的持久登录 Cookie Jens Roland 建议 And 不要将
  • 如何使用动态规划确定最长递增子序列?

    我有一组整数 我想找到最长递增子序列 https en wikipedia org wiki Longest increasing subsequence该集合使用动态规划 好的 我将首先描述最简单的解决方案 即 O N 2 其中 N 是集
  • 条件 haml - if else 嵌套

    我想要的是 if 中的内容和 else 中的内容以包含 main block if transparency content inner style gt background url images illustrations transp
  • iOS 推送通知中的粗体(或其他格式)

    内置的消息应用程序会在推送通知中显示消息发送者的姓名bold 可以为我的应用程序执行此操作吗 这样的有效负载会是什么样子 如果相关的话 我正在使用 Mac 应用程序 APN Tester 进行测试 以使用此类有效负载向我的 iPhone 发
  • Fitnesse 与任何其他子系统测试工具[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我们目前正在使用 Fitness 进行子系统测试 我们在使用该工具时遇到很多问题 很少提及 编写 Fi
  • 从 lambda (C++) 创建的 std::function 的奇怪返回行为

    如果函数返回引用但返回类型未显式调用为引用 则我在使用从 lambda 创建的 std functions 时遇到问题 看起来 std function 创建得很好 没有任何警告 但是在调用它时 当需要引用时会返回一个值 导致事情崩溃 这是
  • 为什么枚举中的静态和实例初始化块的行为与类中的行为不同

    在学习 Java 认证测试时 我了解到静态初始化块在加载类时按照源代码中出现的顺序运行一次 实例初始化块在每次创建实例时运行 并且构造函数中的代码每次运行之后创建一个实例 为了测试我创建了一个带有一些静态和实例初始化块的类以及一个带有打印内