为什么这个Java静态字段为空?

时间:2017-04-16 11:35:01

标签: java

b

我对{{1}}的价值感到困惑。我认为结果应该是“这是测试”,但结果是“这是空的”。为什么呢?

6 个答案:

答案 0 :(得分:6)

其他人已经解释了为什么它的运作方式。

但是,有很多方法可以在引用时计算出值。

private static String a;
private static Supplier<String> bSupplier = ()->"this is " + a;

public static void main(String[] args){
    a = "test";
    System.out.println(bSupplier.get()); //Prints "this is a test"
}

当您致电bSupplier.get()时,会计算出该值。如果您更改a的值,并再次调用它,则该值将反映新值。

这不是你应该经常做的事情,但知道这一点很有用。

答案 1 :(得分:4)

您将字符串a添加到字符串b但字符串a尚未定义。您应该在定义字符串后将其添加到字符串b。

private static String a = "test";
private static String b = "this is a " + a;
public static void main(String [] args){
  System.out.println(b);
}

答案 2 :(得分:3)

  

但我希望在更改时更改b。我想要这个效果。我应该怎么   办?

加载类时会初始化静态字段。
因此,在类的方法中,您不能通过简单地更改用于在初始化期间对此字段赋值的变量之一的值来修改静态字段的内容。

在您的情况下,b使用静态字段并不能满足您的需求 b应该是一个静态方法getB(),它根据调用它时的当前String值返回a实例:

public class StaticTest {

    private static String a;

    public static void main(String[] args) {
        a = "test";    
        System.out.println(getB());
    }

    private static String getB(){
       return "this is " + a;    
    } 
}
PS:它与Steven Lowes的答案非常接近,特此针对Java 8。

答案 3 :(得分:2)

你做了

private static String a;
private static String b = "this is " + a;

此时,anull。因此,String b变为

this is null

现在,a中的任何更改都不会反映在b上。因此,这个结果。对于预期的结果,请执行

private String a = "test";
private String b = "this is " + a;

答案 4 :(得分:2)

当类加载器将类加载到JVM中时,它会分三个阶段完成

1。)加载

2。)链接 (进一步分为三个步骤,即 (a。)验证,(b。)准备,(c。)解决)

3.)初始化

因此,在准备(链接)阶段,类加载器初始化静态变量(不是实例)并将它们设置为默认初始值(非实际值),对于字符串,它为空。

现在在初始化阶段,静态变量被分配了它们的实际值,而a仍然是null。因为main方法将在此步骤之后运行。

因此,在a为空时,在初始"test"内部已为b分配值ab已由类加载器分配,因此这是String {{1有奇怪的输出。

答案 5 :(得分:1)

因此,首先,当您运行程序时,这些静态字段会在主方法运行之前按照定义的顺序设置,因此a设置为null,并且b设置为"this is null",然后运行您的主要方法,使a的值为"test"

Java看到的内容

private static String b = "this is" + a;

需要"this is"并将a附加到其上。如果a的值稍后更改,则b的值不会被赢,因为b不存储指向变量的链接{ {1}},它只存储分配的值。