Java将静态字段初始化为自身

时间:2014-09-04 10:42:18

标签: java

此代码编译(使用Java 8),发出警告The assignment to variable value has no effect

package test;

public class Test {
    private static int value;

    static {
        value = Test.value;
    }

    public static void main(String[] args) {
        System.out.println(value);
    }
}

该计划按预期输出0。但是为什么编译器允许这个,用例是什么?

2 个答案:

答案 0 :(得分:2)

因为Java中的变量具有在任何其他初始化之前初始化的默认值,除非在声明变量时直接进行初始化。确实value0

警告似乎是合理的,为自己分配变量没有明显的效果,但我不认为它应该被视为编译类型错误,因为它在语法和语义上都是正确的。

答案 1 :(得分:1)

如果将变量赋给自身,则编译器会发出警告,如下所示:

  int x = 2;

  x = x;

这个警告通常是编程问题的标志,所以拥有它是好事,但在变量是volatile的情况下,这将是 ONLIEST 有用< strong>使用案例我可以想一想,警告是不正确的。

  int y = 0;
  volatile int x = 2;
  y = 3;
  x = x;

java内存模型强制按顺序读取x和y的每个线程都保证看到y的值为3。这是因为在一个线程中分配x并在另一个线程中读取x会建立事先排序。

赋值对变量的值没有影响,但它对并发性有很大的影响。

请注意,在上面的示例中,可以使用

来抑制警告
 x = x + 0;

然而,没有这样的黑客参考。在尝试同步int[]的内容时,会遇到一个用例。一个线程读取成员:

myarray[3]

和另一个线程写成员:

myarray[3] = 2;

因为数组成员他们自己不能是volatile,所以你必须使myarray volatile并将以下内容添加到写入线程中:

myarrray = myarray;