2014-09-04 114 views
-1

此代码编译(使用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按预期方式。但为什么编译器允许这样做,用例是什么?

+0

好吧,它警告你,无论如何,这是毫无意义的,我猜这是侵入性的,不允许某人写出明显的东西,它并不真正影响流你的程序,为什么你会期望编译错误? – theMarceloR 2014-09-04 10:47:37

+0

有一个用例,看到我的答案在下面... – CodeFanatic 2014-09-04 11:24:04

+0

@Andrew Moss很好,你接受一个答案,它不回答你的问题什么是用例... – CodeFanatic 2014-09-04 11:29:53

回答

2

因为Java中的变量有一个默认值,它在任何其他初始化之前被初始化,除非初始化直接发生在声明变量时。的确,value0

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

+0

什么是用例? – CodeFanatic 2014-09-04 10:47:08

+3

@FelixLahmer:'if(true)'的相同用例。正确的代码(从编译器的角度来看)并不意味着有用的代码。如果(真)也提出错误? – Jack 2014-09-04 10:48:34

+0

够公平的。如果您在同一行声明并初始化该字段,它看起来更加怪异。使用静态初始化程序,它会更清晰地发生。 – 2014-09-04 10:54:22

1

如果作为变量分配给本身,编译器会发出警告,如下列:

int x = 2; 

    x = x; 

这个警告通常是一个规划问题的征兆,所以它本身是一件好事,有它,但在变量是易变的情况下,这将是ONLIEST有用用例我可以认为,警告是不正确的。

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; 

由于阵成员themselfes无法挥发,你必须做出myarray挥发,并添加以下到写线程:

myarrray = myarray;