2014-09-04 54 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;