2013-10-12 75 views

回答

1

您感到困惑的原因是C#和Java中的局部變量範圍的規則不同 - 對於Java(您用Java標籤發佈了問題)範圍從變量聲明發生和擴展的位置開始向下到封閉塊的末端。因此,在你的例子中,println實際上並沒有考慮局部變量,而是靜態字段,因爲局部變量在技術上不在該範圍內。

如果你在C#中做了同樣的事情(包括的鏈接是C#而不是Java),你確實會得到一個錯誤。在那裏,作用域的規則是不同的 - 在C#中變量的作用域是整個封閉塊,所以它也包含聲明之前的語句,但出現在塊中。如果您的示例是C#,則main中的第一條語句將訪問非初始化變量,這是一個編譯器錯誤。

0
public static String toHelp = "--help"; 

你已經宣佈它,並將其定義等於「--help」。

掃描儀輸入可以重新設置。

1

toHelp是一個靜態變量。它對你的main()可見,因爲它已經聲明和初始化。

如果你問的是args,那麼它的一個方法參數,因此,它已經聲明爲方法聲明本身的一部分。

如果它是一個實例變量,那麼你可以使用this.toHelp來訪問那個方法。和(在這種情況下)它的一個靜態變量,你可以使用ClassName.toHelp來區分這兩個變量。

+0

@SotiriosDelimanolis - 謝謝:)更新了答案。 – SudoRahul

+0

對於Java:'toHelp'的第二個聲明會創建一個新的局部變量(在函數級作用域內)掩蓋文件作用域變量嗎?如果是這樣,你將如何區分這兩個函數的後面? (上面Sotirios Delimanolis回答:http://stackoverflow.com/a/19335195/1364365) – Garrick

+1

如果它是一個實例變量,那麼你使用'this.toHelp'。但在這種情況下,它是一個靜態變量,因此您可以使用'ClassName.toHelp'來區分它們。 – SudoRahul

2

查看評論

public static void main(String[] args) { 
    System.out.println(toHelp); // using the already initialize static variable 
    String toHelp = args[0]; // shadowing the static variable with a local variable 
} 

陰影在Java Language Specification here.

解釋

String toHelp = args[0]; 

執行後你有兩個變量在範圍名toHelp。本地人可以通過其名稱toHelp進行訪問。現在需要使用ClassName.toHelp來訪問類static變量,因爲它是被遮蔽的。

+0

我不認爲它是在陰影之下,創建一個全新的方法的局部變量,對吧? –

+1

@sᴜʀᴇsʜᴀᴛᴛᴀJLS聲明_某些聲明可能會在其範圍的一部分被另一個相同名稱的聲明所遮蔽,在這種情況下,不能使用簡單的名稱來指代聲明的實體。我認爲這適用於此。我發佈的鏈接中甚至有一個例子。 –

+0

有道理,我認爲影子概念只適用於類型,子類型關係:),我想我必須仔細檢查一下這個鏈接。 –

相關問題