gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 19:37:12 28 4
gpt4 key购买 nike

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());
}

}

输出:

Setting cons()
value is null

即使我在构造函数中设置了 static 变量并且按预期调用了它,为什么它仍将值打印为 null。如果我尝试在构造函数中打印,它打印的是 Testing,但如果我从 public static 方法调用,它是 null。我知道如果我将它更改为 INSTANCE.name,它会起作用。但我想了解为什么如果我直接访问 static 变量它不起作用,因为应该共享相同的副本。我在这里缺少什么?

最佳答案

因为 name 的值在构造函数调用后按照声明顺序被修改。

让我们看看发生了什么:

1) 当您调用 InstanceBuilder.getName() 时,将加载 InstanceBuilder 类。作为该过程的一部分,INSTANCEname 实例变量正在初始化。

2) 在初始化INSTANCE时,

private static final InstanceBuilder INSTANCE = new InstanceBuilder();

InstanceBuilder 类的构造函数被调用 & Setting cons() 语句被打印并且 name 变量被初始化 Testing

3) 由于以下语句,下一个 name 再次被重新初始化为 null

private static String name = null;

所以当方法调用返回到 Driver 类时,name 的值为 null 并且 null 正在获取打印。因此,即使 name 被声明为 static,static 在该上下文中也没有任何作用。

注意:

检查以下链接中应声明哪些类成员的顺序

http://www.oracle.com/technetwork/java/javase/documentation/codeconventions-141855.html#1852

关于java - 了解 Java 中的静态变量初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39523234/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com