Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java静态块引用另一个类中的静态变量 公共A类{ 公共静态字符串主机; 静止的{ 主机=。。。; } } 公共B级{ 公共静态字符串URL; 静止的{ URL=A.HOST+。。。; } }_Java_Language Lawyer - Fatal编程技术网

Java静态块引用另一个类中的静态变量 公共A类{ 公共静态字符串主机; 静止的{ 主机=。。。; } } 公共B级{ 公共静态字符串URL; 静止的{ URL=A.HOST+。。。; } }

Java静态块引用另一个类中的静态变量 公共A类{ 公共静态字符串主机; 静止的{ 主机=。。。; } } 公共B级{ 公共静态字符串URL; 静止的{ URL=A.HOST+。。。; } },java,language-lawyer,Java,Language Lawyer,我的问题是A.HOST是否在B使用之前正确初始化? 该行为是否在规范中定义 类的静态块在类被调用时执行 访问,以创建实例或访问静态方法 或场 这取决于我们正在执行的代码 在您的例子中,当我们执行A.HOST时,它也调用类的静态块 提及 类的静态初始值设定项在类第一次运行时运行 已访问,以创建实例或访问静态方法 或场 来源:是的,行为定义明确 简言之,引用该链接 类或接口的初始化包括执行类或接口初始化方法 类或接口只能在以下情况下初始化: 执行引用类或接口的任何Java虚拟机指令new、gets

我的问题是A.HOST是否在B使用之前正确初始化? 该行为是否在规范中定义

类的静态块在
类被调用时执行
访问
,以创建实例或访问静态方法 或场

这取决于我们正在执行的代码

在您的例子中,当我们执行
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
尚未初始化,它是否会导致任何问题?我只是对程序流感到困惑,是的,这是一个问题。感谢您的评论。