2017-06-16 65 views
-1

我在理解java中的任何語句都應該在代碼塊中。 但我在下面的代碼中看到System.getenv();不在代碼塊中。但是如果我在它下面放置一個System.out.println(),編譯器會抱怨。 System.getenv()在這裏被視爲聲明而不是聲明?Java系統的外部代碼塊

package gov.ssa.epa; 

public class AdvJ { 

    private static final Map<String, String> INVALID_FILTER_KEY = System.getenv(); 

    System.out.println("hello"); 

    public static void main(String[] args) { 


    } 
+0

該類型的靜態分配是合法的。它與'private static int x = 5;'沒有什麼不同;'任何給定的任意語句可能都不會。 – CollinD

+1

內聯初始化允許在代碼塊之外,但是'System.out.println(「hello」);'不是初始化語句 – JonK

+0

[Java™教程:初始化字段](https://docs.oracle.com /javase/tutorial/java/javaOO/initial.html) –

回答

0

System.getenv()不是一個語句,它是一個初始化表達式,用作字段聲明的一部分。在任何方法之外的上下文中允許字段聲明 - 事實上,這是字段聲明唯一可以去的地方。初始化表達式附加到聲明中,所以自然也允許它們。另一方面,

System.out.println不是一個聲明,所以它不允許超出函數或初始化塊。

+0

我認爲System.getenv()是一個語句。只是語句被允許作爲初始化表達式的一部分? – Sam

+0

@Sam不要想,看看它。你錯了。 –

+0

我確實看過,我只是很有禮貌。來自維基百科 - *在計算機編程中,一個語句是命令式編程語言中最小的獨立元素,它表達了要執行的一些操作。* 獲取環境似乎與此描述相匹配,不是嗎? 某些類型的語句是斷言,賦值,轉到,返回和(在這種情況下)**調用**。 – Sam

-1

這是因爲private static final Map INVALID_FILTER_KEY = System.getenv()是一個私有類實例變量。這些實例變量可以在類中的任何位置使用,因此可以在任何方法之外聲明。在方法中聲明的變量只能在該方法中使用。調用System.out.println時遇到問題的原因是因爲這是實際的可執行代碼,要運行實際代碼,它需要位於方法中。考慮查看本教程,瞭解它如何在java類中工作https://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html