2 回答

TA貢獻(xiàn)2019條經(jīng)驗(yàn) 獲得超9個(gè)贊
在嵌套作用域中創(chuàng)建同名的新變量稱為變量隱藏,Java 在多種情況下確實(shí)允許這樣做。這x是在嵌套范圍內(nèi)聲明四次的示例:
class MyTest {
String x = "class member";
void foo() {
System.out.println("x = " + x);
String x = "local variable";
System.out.println("x = " + x);
new Runnable() {
String x = "inner class member";
public void run() {
System.out.println("x = " + x);
String x = "inner local variable";
System.out.println("x = " + x);
}
}.run();
}
public static void main(String[] list) {
new test().foo();
}
}
如您所見,它已經(jīng)有些令人困惑。當(dāng)您不小心使用錯(cuò)誤的變量時(shí),這可能會(huì)導(dǎo)致嚴(yán)重的錯(cuò)誤,即使代碼在不同的范圍內(nèi)非常好并且編譯時(shí)沒有警告。
例如,這段代碼應(yīng)該做什么?
for(int i=0; i<10; i++) {
for(int i=0; i<10; i++) {
System.out.println(i);
}
}
C++ 會(huì)說(shuō)“這些應(yīng)該是兩個(gè)單獨(dú)的變量”
JavaScript 會(huì)說(shuō)“這些應(yīng)該是同一個(gè)變量”
Java 說(shuō)“這令人困惑,請(qǐng)選擇更好的名稱”,并且不允許在單個(gè)函數(shù)中隱藏局部變量。

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超5個(gè)贊
這沒有改變。Java 就是這樣設(shè)計(jì)的。局部變量不能被同一函數(shù)中定義的其他變量遮蔽。原因是一致性,所有外部變量對(duì)內(nèi)部作用域也是可見的。
這是一種情況,Java 的工作方式與 C 和 C++ 不同,后者允許同一函數(shù)中的變量相互遮蔽。
添加回答
舉報(bào)