【发布时间】:2014-04-15 20:07:55
【问题描述】:
我正在尝试将 JVM 中的初始化和实例化过程拼凑起来,但 JLS 在一些细节上有点迟钝,所以如果有人愿意澄清一些细节,我们将不胜感激。到目前为止,这是我能够弄清楚的。
初始化
递归地初始化类的静态最终变量,它的接口是编译时常量。
按文本顺序退出递归处理静态块和静态字段。
实例化
递归地初始化作为编译时常量的类的最终实例变量。
-
退出递归处理非静态块和实例字段以文本顺序在返回时将它们添加到构造函数。
好的,现在开始提问。
接口是否按声明顺序处理?
-
接口是否在单独的递归堆栈中处理?
a) 如果是,接口是在超类之前还是之后处理的?
b) 如果是,我是否正确推断出其中一个或其他(接口或超类)在其他编译时常量之前初始化其非编译时常量字段。
对非默认 super() 构造函数的调用在此过程中扮演什么角色?
我的结论有误吗?
我是否遗漏了任何其他关键细节?
【问题讨论】:
-
接口没有任何需要初始化的东西。除非你使用这个词的方式与我习惯的不同。
-
@BobDalgleish 接口可能具有公共静态最终字段。如果这些字段是具有初始化程序的对象(例如
public static final ArrayList<String> someStrings = new ArrayList<>();),那么这将是初始化的一部分。
标签: java