了解Java中的静态变量初始化

Kar*_*ars 5 java

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变量它不起作用,因为应该共享相同的副本.我在这里缺少什么?

mus*_*ibs 8

因为根据声明顺序在构造函数调用之后会修改name的值.

让我们看看发生了什么:

1)当你打电话时InstanceBuilder.getName(),InstanceBuilder课程正在加载.作为这一过程的一部分,INSTANCEname实例变量越来越初始化.

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