Java初始化和实例化的顺序

2023-11-30

我正在尝试将 JVM 中的初始化和实例化过程拼凑在一起,但 JLS 在一些细节上有点迟钝,因此如果有人介意清理一些细节,我们将不胜感激。这是我到目前为止所能弄清楚的。

初始化

  1. 递归地初始化类的静态最终变量及其作为编译时常量的接口。

  2. 按文本顺序退出递归处理静态块和静态字段。

实例化

  1. 递归地初始化作为编译时常量的类的最终实例变量。

  2. 返回按文本顺序处理非静态块和实例字段的递归,在返回时将它们添加到构造函数中。


好的,现在提问。

  1. 接口是按照声明的顺序处理的吗?

  2. 接口是否在单独的递归堆栈中处理?

    a) 如果是,接口是在超类之前还是之后处理?

    b)如果是,我是否正确地推断出一个或其他(接口或超类)在其他编译时常量之前初始化其非编译时常量字段。

  3. 在此过程中,对非默认 super() 构造函数的调用起什么作用?

  4. 我的结论是否有误?

  5. 我是否遗漏了其他关键细节?


区分类的初始化和对象的初始化很重要。

类初始化

类或接口初始化于首次访问,通过分配编译时常量字段,然后递归地初始化超类(如果尚未初始化),然后处理静态初始化程序(其中包括不是编译时常量的静态字段的初始化程序)。

正如您所注意到的,类的初始化本身不会触发其实现的接口的初始化。因此,接口在首次访问时会被初始化,通常是通过读取不是编译时常量的字段来初始化。此访问可能发生在初始化程序的求值期间,从而导致递归初始化。

还值得注意的是,初始化不是通过访问编译时常量字段来触发的,因为这些字段是在编译时间:

对常量变量(第 4.12.4 节)字段的引用必须在编译时解析为由常量变量的初始值设定项表示的值 V。

如果这样的字段是静态的,则二进制文件的代码中不应存在对该字段的引用,包括声明该字段的类或接口。这样的字段必须始终显示为已初始化(第 12.4.2 节);决不能遵守该字段的默认初始值(如果与 V 不同)。

如果这样的字段是非静态的,则二进制文件的代码中不应存在对该字段的引用,包含该字段的类除外。 (它将是一个类而不是一个接口,因为接口仅具有静态字段。)该类应该具有在实例创建期间将字段的值设置为 V 的代码(第 12.5 节)。

对象初始化

一个对象被初始化每当创建一个新对象时,通常通过评估类实例创建表达式来实现。其过程如下:

  1. 将构造函数的参数分配给为此构造函数调用新创建的参数变量。

  2. 如果此构造函数以同一类中另一个构造函数(使用 this)的显式构造函数调用(第 8.8.7.1 节)开始,则评估参数并使用这相同的五个步骤递归地处理该构造函数调用。如果该构造函数调用突然完成,则此过程也会出于同样的原因突然完成;否则,继续步骤 5。

  3. 此构造函数不会以显式构造函数调用同一类中的另一个构造函数(使用 this)开始。如果此构造函数用于除 Object 之外的类,则此构造函数将以显式或隐式调用超类构造函数(使用 super)开始。使用这五个步骤递归地评估参数并处理超类构造函数调用。如果该构造函数调用突然完成,则此过程也会出于同样的原因突然完成。否则,继续步骤 4。

  4. 执行此类的实例初始值设定项和实例变量初始值设定项,将实例变量初始值设定项的值按照类源代码中文本出现的从左到右的顺序分配给相应的实例变量。如果执行任何这些初始化程序导致异常,则不会再处理其他初始化程序,并且此过程会突然完成并出现相同的异常。否则,继续步骤 5。

  5. 执行该构造函数主体的其余部分。如果该执行突然完成,则该过程也会出于同样的原因突然完成。否则,该过程将正常完成。

正如我们在步骤 3 中看到的,对超级构造函数的显式调用的存在只会改变调用哪个超类构造函数。

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

Java初始化和实例化的顺序 的相关文章

  • “java.io.IOException:连接超时”和“SocketTimeoutException:读取超时”之间有什么区别

    如果我设置一个套接字 SoTimeout 并从中读取 当读取时间超过超时限制时 我会收到 SocketTimeoutException 读取超时 这是我的例子中的堆栈 java net SocketTimeoutException Read
  • Guice 忽略注入构造函数参数上的 @Nullable

    我正在使用 Guice v 3 0 并且有一个值被注入到构造函数中 该值可以为 null 因此我在构造函数中使用 Nullable 来自 javax annotations 注释了该参数 public MyClass Parameter1
  • 获取文件的锁

    我想在对特定文件开始 threo read 时获取文件上的锁定 以便其他应用程序无法读取已锁定的文件并希望在线程终止时释放锁定文件 您可以获得一个FileLock https docs oracle com javase 8 docs ap
  • Oracle Java 教程 - 回答问题时可能出现错误

    我是 Java 新手 正在阅读 Oracle 教程 每个部分之后都有问题和答案 我不明白一个答案中的一句话 见下面的粗体线 来源是https docs oracle com javase tutorial java javaOO QandE
  • 如何在 Openfire 中使用 smack

    你好 我计划开发一个可以连接到 gtalk facebook 等的聊天客户端 我决定将 smack API 与 openfire 一起使用 但我需要很少的指导来了解如何将它与 openfire 服务器一起使用 openfire 是否提供了基
  • HAProxy SSL终止+客户端证书验证+curl/java客户端

    我希望使用我自己的自签名证书在 HAProxy 上进行 SSL 终止 并使用我创建的客户端证书验证客户端访问 我通过以下方式创建服务器 也是 CA 证书 openssl genrsa out ca key 1024 openssl req
  • 为什么Iterator接口没有add方法

    In IteratorSun 添加了remove 方法来删 除集合中最后访问的元素 为什么没有add方法来向集合中添加新元素 它可能对集合或迭代器产生什么样的副作用 好的 我们开始吧 设计常见问题解答中明确给出了答案 为什么不提供 Iter
  • 添加到列表时有没有办法避免循环?

    我想知道这样的代码 List
  • 如何删除日期对象的亚秒部分

    当 SQL 数据类型为时间戳时 java util Date 存储为 2010 09 03 15 33 22 246 如何在存储记录之前将亚秒设置为零 例如 在本例中为 246 最简单的方法是这样的 long time date getTi
  • 无法在 Java/Apache HttpClient 中处理带有垂直/管道栏的 url

    例如 如果我想处理这个网址 post new HttpPost http testurl com lists lprocess action LoadList 401814 1 Java Apache 不允许我这么做 因为它说竖线 是非法的
  • IntelliJ 组织导入

    IntelliJ 是否具有类似于 Eclipse 中的组织导入功能 我拥有的是一个 Java 文件 其中多个类缺少导入 例子 package com test public class Foo public Map map public J
  • 无需登录即可直接从 Alfresco 访问文件/内容

    我的场景是这样的 我有一个使用 ALFRESCO CMS 来显示文件或图像的 Web 应用程序 我正在做的是在 Java servlet 中使用用户名和密码登录 alfresco 并且我可以获得该登录的票证 但我无法使用该票证直接从浏览器访
  • 我可以限制分布式应用程序发出的请求吗?

    我的应用程序发出 Web 服务请求 提供商处理的请求有最大速率 因此我需要限制它们 当应用程序在单个服务器上运行时 我曾经在应用程序级别执行此操作 一个对象跟踪到目前为止已发出的请求数量 并在当前请求超出允许的最大负载时等待 现在 我们正在
  • 禁用 Android 菜单组

    我尝试使用以下代码禁用菜单组 但它不起作用 菜单项仍然启用 你能告诉我出了什么问题吗 资源 菜单 menu xml menu menu
  • Hadoop NoSuchMethodError apache.commons.cli

    我在用着hadoop 2 7 2我用 IntelliJ 做了一个 MapReduce 工作 在我的工作中 我正在使用apache commons cli 1 3 1我把库放在罐子里 当我在 Hadoop 集群上使用 MapReduceJob
  • 替换文件中的字符串

    我正在寻找一种方法来替换文件中的字符串而不将整个文件读入内存 通常我会使用 Reader 和 Writer 即如下所示 public static void replace String oldstring String newstring
  • 何时在 hibernate 中使用 DiscriminatorValue 注解

    在 hibernate 中使用 DiscriminatorValue 注释的最佳场景是什么以及何时 这两个链接最能帮助我理解继承概念 http docs oracle com javaee 6 tutorial doc bnbqn html
  • Java 的 PriorityQueue 与最小堆有何不同?

    他们为什么命名PriorityQueue如果你不能插入优先级 它看起来与堆非常相似 有什么区别吗 如果没有区别那为什么叫它PriorityQueue而不是堆 默认的PriorityQueue是用Min Heap实现的 即栈顶元素是堆中最小的
  • ArrayList.clear() 和 ArrayList.removeAll() 有什么区别?

    假如说arraylist定义为ArrayList
  • 将对象从手机共享到 Android Wear

    我创建了一个应用程序 在此应用程序中 您拥有包含 2 个字符串 姓名和年龄 和一个位图 头像 的对象 所有内容都保存到 sqlite 数据库中 现在我希望可以在我的智能手表上访问这些对象 所以我想实现的是你可以去启动 启动应用程序并向左和向

随机推荐

  • 如何在CSS中仅设置部分文本的样式[重复]

    这个问题在这里已经有答案了 我需要在下拉列表选项中添加上标 我尝试了很多方法但没有任何效果 因此 帮助我了解如何仅设置选项文本的一部分的样式 使其看起来像上标 如果您知道在下拉列表选项中添加上标的任何其他方法 请帮助我 谢谢 在 HTML
  • 为什么相同的输入返回两个不同的 MD5 哈希值?

    好吧 我有两个文件 它们是完全相同的 第一个文件是 http iadsonline com servconfig php 第二个文件是 http xzerox info servconfig php 但是 当我使用 md5 file 获取他
  • 创建时CYPHER存储相同标签的节点关系顺序

    我有多个源自一个节点的关系 这些关系中的每一个都具有相同的标签 这些关系指向一个子节点 不一定是唯一的 在获取通过此关系标签链接到父级的所有子节点后 我通过名为 trueindex 的关系属性对它们进行排序 然后 我有一个节点数组 我的客户
  • 预处理器中的 C# 宏定义

    C 是否能够像 C 编程语言中使用预处理器语句那样定义宏 我想简化某些重复语句的常规输入 如下所示 Console WriteLine foo 不 C 不支持像 C 那样的预处理器宏 另一方面 Visual Studio 有snippets
  • 片段中的 AdMob

    我正在我的应用程序中插入 AdMob 但我有一个问题 当我在 Eclipse 中插入一些相关代码时 我可以在fragment 03中看到一条关于 构造函数 AdRequest 不可见 的错误消息 以及 错误 解析 XML 时出错 未绑定前缀
  • 获取上周六的日期和下周五的日期

    我想根据今天的日期获取上周六的日期 所以如果我们是周二 那么想要的日期将是 3 天前 另外 如果今天是星期六 那么这将被算作上一个星期六 例如 today Tuesday 09 July 2019 previous saturday gt
  • 内联成员函数和普通成员函数有什么区别?

    内联成员函数 函数体内联 和其他普通成员函数 函数体在单独的 cpp文件中 有什么区别吗 例如 class A void member and Header file hpp class B void member Implementati
  • C++多索引映射实现

    我正在 C 11 中实现多索引映射 我希望针对特定功能对其进行优化 我目前正在尝试解决的问题是不要多次存储关键元素 但让我解释一下 问题源于对直方图进行排序以将它们叠加在不同的组合中 直方图有名称 可以分为标记 属性 以下是我希望我的属性图
  • Pyomo 和条件目标函数

    是否可以 如果可以的话如何 使用具有条件表达式的目标函数 更改文档中的示例 我想要一个如下表达式 def objective function model return model x 0 if model x 1 lt const els
  • 将 jQuery 选项卡与 Marionette 布局结合使用

    我正在尝试使用jquery 选项卡秘偶区域内 两个选项卡区域的 HTML 如下所示 div ul li a href tabs 1 Nunc tincidunt a li li a href tabs 2 Proin dolor a li
  • 如何在mysql工作台中更改用户

    我使用以下语法在 mysql 工作台中创建了用户名 jeffrey 密码 mypass CREATE USER jeffrey localhost IDENTIFIED BY mypass 现在我如何连接 登录这个用户 jeffrey 请按
  • Arm trustzone监控模式开关设计

    基本的世界切换流程是 将FIQ设置为监控模式 normal world gt FIQ triggered gt 进入监控模式 切换到安全世界 恢复安全世界上下文 gt 在安全世界系统模式下 gt FIQ不清楚 进入Secure world中
  • 如何在 SublimeREPL 上运行 Python 代码

    我真的很喜欢使用 sublime text 2 编写 Python 代码 但是每当我尝试运行具有输入的脚本时 sublime text 控制台都会报告错误 所以 我决定尝试一下SublimeREPL 但是我已经搜索了几个小时 但没有找到如何
  • 将行样本与类标签相匹配

    我对下面的代码有一个小问题 最后一行是具体的 我试图找到我的 样本 的类名 我的意思是我需要知道哪个法线和哪个蓝精灵属于我的 1000x6 样本的每一行 sampling normIdx strmatch normal Book2 norm
  • 获取没有底部导航栏高度的屏幕尺寸

    所以flutter中的基本脚手架有appbar body和bottom bar 在我的底部导航栏中 我有 3 个项目 第 1 页 编辑器页面 第 2 页 贴纸 第3页 文字定制页面 每个页面都有自己的脚手架 编辑器页面有一个名为 Layou
  • 在 C# 中,字符串是引用类型,但为什么在另一种方法中操作它后它没有改变[重复]

    这个问题在这里已经有答案了 可能的重复 C 字符串引用类型 比如说 我有一个名为 string sample Initial value 传递给方法 test 之后 public static void Test string testSt
  • Xamarin 形成 MVVM Stacklayout 内容绑定

    我对 Xamarin 和 Xamarin 表单非常陌生 我需要一些帮助 我有一个 StackLayout 我想从 ViewModel 动态添加项目 问题是我似乎无法将 StackLayout 的内容绑定到 ViewModel 的 Stack
  • 单击 Facebook“赞”按钮获取用户电子邮件 ID?

    我想要用户点击 facebook Like 按钮时的电子邮件地址 这是我正在使用的代码 FB Event subscribe edge create function response like clicked 但响应只有 HREF 我该怎
  • Wordpress 和 Woocommerce 中的挂钩及其挂钩函数执行队列

    尽管我在其他网络平台和语言方面有经验 但我还是 WordPress WooCommerce 和 PHP 的新手 我已经搜索过 但没有找到我的问题的答案 由 add action 创建的挂钩是否 添加 到该特定挂钩调用的操作列表中 或者它们是
  • Java初始化和实例化的顺序

    我正在尝试将 JVM 中的初始化和实例化过程拼凑在一起 但 JLS 在一些细节上有点迟钝 因此如果有人介意清理一些细节 我们将不胜感激 这是我到目前为止所能弄清楚的 初始化 递归地初始化类的静态最终变量及其作为编译时常量的接口 按文本顺序退