[英]Local variable in Java with the same name as a global variable
我正在嘗試理解Java中的范圍。 在Perl中,我可以執行以下操作:
my $x = 1;
{
my $x = 2;
say $x; # prints 2
}
say $x; # prints 1
換句話說,由於my
在范圍內使用my
聲明了變量$ x,因此該范圍內的$ x變量是該范圍的本地變量(即,與全局$ x變量不同的變量)。 現在,在Java中我試圖做類似的事情,但我得到了錯誤
變量rawURL已在方法run()中定義
這是代碼:
// Global rawURL
URI rawURl;
try {
rawURL = new URI("http://www.google.com");
} catch (Exception e) {
// Handle later
}
// Some time later
for (Element link : links) {
// rawURL in this scope
URI rawURL;
try {
rawURL = new URI(link.attr("abs:href"));
} catch (Exception e) {
// Handle later
}
}
現在,問題是,我不想讓我的所有變量名都有創意,確保每個變量名都不同。 我只是使用rawURL來構建規范化的URL,因此它本質上是一個臨時變量。 我可以這樣做:
for (Element link : links) {
rawURL = new URL(..);
}
但那會改變我的全局變量的內容,我真的不希望這樣。 有沒有辦法使用與我用於全局變量的局部變量相同的名稱?
您必須使用新名稱定義新的局部變量,因為變量的范圍如下:current block + subblocks。 因此,在您的情況下,rawURL是為您所謂的“全局”定義的,並且它對子塊可見,即進入for塊。
在java中,你可以這樣做:
{
String myvar = "";
}
{
String myvar = "";
}
因為在這里,同一級別有兩個不同的塊
但你做不到:
String myvar = "";
{
String myvar = "";
}
因為同一個塊(子塊)中的兩個變量存在同名沖突。
在java中,您有公共和私有訪問修飾符來控制變量的可訪問性,但是如果在類中聲明一個變量,它將是一個全局變量,而類方法中的變量將是本地變量,而不是方法之外的變量。 。 沒有絕對的全局變量和局部變量,您必須聲明和定義新變量的新變量名稱。
public class abc{
public int a; //global and accessible by every class outside this class too
private int b; //global and accessible only within this class
private void m(){
int x; //local and accessible only within this method
}
}
另外你可以做到這一點
public void m(){
for(;;){
int a;
}
for(;;){
int a;
}
}
但你不能這樣做
public void m(){
int a;
for(;;){
int a;
}
}
希望這可以幫助你。
在Java中我試圖做類似的事情,但我收到錯誤
變量rawURL已在方法run()中定義
JLS解釋了為什么會出現錯誤:
6.4。 陰影和遮蔽
如果使用局部變量
v
的名稱來聲明v
的范圍內的新變量,那么這是一個編譯時錯誤,除非在聲明在v
的范圍內的類中聲明了新變量。
並解釋一下v
的范圍是什么,我在解釋它的答案 。
基本上,如果將它與Perl進行比較,范圍是“單向”而不是“雙向”。
void method1() {
int x;
{
int y = x; // O.K. - x is in scope.
int x = y; // Not O.K. - x is in scope and was already declared.
}
x = y; // Not O.K. - y is not in scope.
}
你可以做什么,這個:
void method2() {
int x;
class InsideClass {
{
int y = x;
int x = y;
}
}
}
但這對你的需求來說可能是一種過度殺傷力。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.