Java静态块引用另一个类中的静态变量 公共A类{ 公共静态字符串主机; 静止的{ 主机=。。。; } } 公共B级{ 公共静态字符串URL; 静止的{ URL=A.HOST+。。。; } }
我的问题是A.HOST是否在B使用之前正确初始化? 该行为是否在规范中定义 类的静态块在Java静态块引用另一个类中的静态变量 公共A类{ 公共静态字符串主机; 静止的{ 主机=。。。; } } 公共B级{ 公共静态字符串URL; 静止的{ URL=A.HOST+。。。; } },java,language-lawyer,Java,Language Lawyer,我的问题是A.HOST是否在B使用之前正确初始化? 该行为是否在规范中定义 类的静态块在类被调用时执行 访问,以创建实例或访问静态方法 或场 这取决于我们正在执行的代码 在您的例子中,当我们执行A.HOST时,它也调用类的静态块 提及 类的静态初始值设定项在类第一次运行时运行 已访问,以创建实例或访问静态方法 或场 来源:是的,行为定义明确 简言之,引用该链接 类或接口的初始化包括执行类或接口初始化方法 类或接口只能在以下情况下初始化: 执行引用类或接口的任何Java虚拟机指令new、gets
类被调用时执行
访问
,以创建实例或访问静态方法
或场
这取决于我们正在执行的代码
在您的例子中,当我们执行A.HOST
时,它也调用类的静态块
提及
类的静态初始值设定项在类第一次运行时运行
已访问,以创建实例或访问静态方法
或场
来源:是的,行为定义明确
简言之,引用该链接
类或接口的初始化包括执行类或接口初始化方法
类或接口只能在以下情况下初始化:
执行引用类或接口的任何Java虚拟机指令new、getstatic、putstatic或invokestatic(§new、§getstatic、§putstatic、§invokestatic)。所有这些指令都通过字段引用或方法引用直接或间接引用类
在执行新指令时,如果引用的类或接口尚未初始化,则初始化该类或接口
在执行getstatic、putstatic或invokestatic指令时,如果声明已解析字段或方法的类或接口尚未初始化,则初始化该类或接口
java.lang.invoke.MethodHandle实例的第一次调用,该实例是java虚拟机解析方法句柄的结果(§5.4.3.5),其类型为2(REF_getStatic)、4(REF_putStatic)或6(REF_invokeStatic)
调用类库(§2.12)中的某些反射方法,例如在类或包java.lang.reflect中
它的一个子类的初始化
它被指定为Java虚拟机启动时的初始类(§5.2)
方法是(由编译器创建的)初始化静态变量的方法,并将代码放入静态
块中
在您的情况下,当类B
的static
块运行时(这就是
将要做的),它将有一个getStatic
操作码,请求a.HOST
。因此将触发A
的初始化,并初始化A.HOST
。因此,您将读取正确的值。在main()方法执行之前,将执行一个静态块。并且您的结论是“是”或“否”,A将在B使用它之前初始化?@user3360241刚刚编辑,如果仍然不清楚,请告诉我。只需运行一个简单的测试,看看它是否初始化。如果您引用了第一个,A将被完全初始化,无论何时您第一次调用B,它都可以正常工作。如果你先调用B,当遇到A.HOST时,它会级联到A。有趣的是,如果A有类似于HOST=B.FOO
的东西。不过,我不确定是否会编译。你能解释一下你的答案与所问问题的关系吗?我的意思是,静态块中的代码在main方法之前执行,类B写在类A旁边,可能字符串被初始化了,当它被类B访问时不会有问题。我想你不理解这个问题B.URL
和A.HOST
都是静态的。但是B.URL
初始化需要A.HOST
。所以问题是,当初始化B.URL
时,A
尚未初始化,它是否会导致任何问题?我只是对程序流感到困惑,是的,这是一个问题。感谢您的评论。