2009-07-07 27 views
19

我正在閱讀我的Deitel,Java如何編程書並碰到術語shadowing。如果允許遮蔽,Java類有什麼情況或有什麼目的?什麼是在Java類中使用的變量陰影?

例子:

public class Foo { 

    int x = 5; 

    public void useField() { 
     System.out.println(this.x); 
    } 
    public void useLocal() { 
     int x = 10; 
     System.out.println(x); 
    } 
} 

回答

32

陰影的基本目的是將本地代碼從周圍的類中分離出來。如果無法使用,請考慮以下情況。

API中的Foo類被釋放。在你的代碼中,你可以繼承它的子類,在你的子類中使用一個名爲bar的變量。然後,Foo發佈一個更新並將一個名爲Bar的受保護變量添加到其類中。

現在,您的班級將無法運行,因爲您無法預見到衝突。

但是,不要故意這樣做。只有當你真的不關心範圍之外發生的事情時,纔會發生這種情況。

8

的一個主要目的是迷惑人。這是不好的做法,應該避免。

+0

爭議我認爲;-) – 2009-07-07 12:56:45

+6

你能否進一步解釋this.x = X是如何在所有的混亂? – RichieHH 2015-01-16 18:46:47

13

它可以爲制定者,你不希望有公正的方法參數例如創建一個單獨的變量名有用:

public void setX(int x) { 
    this.x = x; 
} 

除此之外,我會避開他們。

+1

這是影響變量的可怕原因。陰影始終會讓您知道潛在的錯誤,並且使用範圍信息命名變量以及更改參數的名稱比包含「this」更容易。每次。 – Rick 2014-03-18 22:44:16

+3

對於一個簡單的二傳手來說,就像上面的例子,我認爲這很好,重命名參數會讓事情變得醜陋。任何比這更復雜的事情,我同意,完全避免。 – 2014-03-19 10:07:05

4

影子並不是真正的java術語。在範圍中聲明的變量與更大範圍中的變量名稱相同的任何情況下,該變量都會被映射。

陰影的一些常見用途是當您有內部類和外部類並且想要維護具有相同名稱的變量時。

如果你可以避免它,你應該,因爲它可能會導致混淆。

1

兩個常見的用途是構造和設置方法:

public Foo(int x) { 
    this.x = x; 
} 

public void setX(int x) { 
    this.x = x; 
} 

很偶爾,如果你想在一個瞬間變量的副本,它是有用的,但變量可能在方法調用中更改。

private void fire() { 
    Listener[] listeners = this.listeners; 
    int num = listeners.length; 
    for (int ct=0; ct<num; ++ct) { 
     listeners[ct].stateChanged(); 
    } 
} 

(當然,一個人爲的例子做不必要與豪華的循環。)