public class InstanceBuilder {
private static final InstanceBuilder INSTANCE = new InstanceBuilder();
private static String name = null;
private InstanceBuilder() {
System.out.println("Setting cons()");
name = "Testing";
}
public static String getName() {
return name;
}
}
public class Driver {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("value is " + InstanceBuilder.getName());
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
Setting cons()
value is null
Run Code Online (Sandbox Code Playgroud)
为什么它打印值,null即使我static在构造函数中设置了变量并按预期调用它.如果我尝试在构造函数中打印,它是打印Testing,但如果我从public static方法调用,它是null.我知道如果我改变它INSTANCE.name,它的工作原理.但我想理解为什么如果我直接访问static变量它不起作用,因为应该共享相同的副本.我在这里缺少什么?
因为根据声明顺序在构造函数调用之后会修改name的值.
让我们看看发生了什么:
1)当你打电话时InstanceBuilder.getName(),InstanceBuilder课程正在加载.作为这一过程的一部分,INSTANCE和name实例变量越来越初始化.
2)初始化时INSTANCE,
private static final InstanceBuilder INSTANCE = new InstanceBuilder();
Run Code Online (Sandbox Code Playgroud)
InstanceBuilder类的构造函数被调用&Setting cons()语句被打印并且name变量被初始化Testing.
3)由于以下陈述,接下来name再次重新初始化null
private static String name = null;
因此,当方法调用返回到Driver类时,值为nameis null并且null正在打印.因此即使name声明为static,静态在该上下文中也没有任何作用.
注意:
检查下面的链接,了解应该声明哪些类成员的顺序
http://www.oracle.com/technetwork/java/javase/documentation/codeconventions-141855.html#1852