以下代码打印null一次.
class MyClass {
private static MyClass myClass = new MyClass();
private static final Object obj = new Object();
public MyClass() {
System.out.println(obj);
}
public static void main(String[] args) {}
}
Run Code Online (Sandbox Code Playgroud)
为什么在构造函数运行之前没有初始化静态对象?
更新
我只是在没有注意的情况下复制了这个示例程序,我以为我们正在谈论2个Object字段,现在我看到第一个是MyClass字段..:/
当我运行这段代码时答案是1,我认为它将是2.初始化的顺序和每一步中k的值是多少?
public class Test {
static {k = 2;}
static int k = 1;
public static void main(String[] args) {
System.out.println(k);
}
}
Run Code Online (Sandbox Code Playgroud)
编辑1:作为"k设置为默认值"的后续内容,为什么下一个代码不能编译?这是一个错误"无法在定义之前引用字段".
public class Test {
static {System.out.println(k);}
static int k=1;
public static void main(String[] args) {
System.out.println(k);
}
}
Run Code Online (Sandbox Code Playgroud)
编辑2:对于一些我不知道的原因,当^而不是"k"它的"Test.k"时它起作用.
感谢所有的答案.这将是完美的:D
public class StaticTest {
private static String a;
private static String b = "this is " + a;
public static void main(String[] args) {
a = "test";
System.out.println(b); // prints "this is null"
}
}
Run Code Online (Sandbox Code Playgroud)
我对它b的价值感到困惑.我认为结果应该是"这是测试",但结果是"这是空的".为什么?