2010-10-27 120 views
0

當您在方法中聲明局部變量時使用相同的名稱和類型,如實例變量 - 是否意味着實例變量在該方法內變爲「不可見」?在聲明局部變量var後,實例變量變爲不可見

public class Test { 
Card card; 
public void foo(){ 
    Card card = new Card(); 
    card.test(); 
} 
} 

所以我聲明並實例化foo()方法中的局部變量卡。然後調用局部變量的test()方法。如果我刪除了Card card = new Card();,則會爲實例變量調用test()方法。

回答

8

你所看到的有時被稱爲「陰影」變量。任何時候在內部範圍內聲明一個變量時,該變量都將成爲與該名稱關聯的默認變量,直到它超出範圍。

在這種情況下,您可以訪問類變量使用語法:

this.card 
7

實例變量不會變爲不可見,但它被本地變量隱藏。您仍然可以通過this.card訪問它。

+4

它看到這個在構造函數中,這裏的構造函數參數隱藏實例成員共同的地方。除此之外,這可能是您的實例成員應具有更多描述性或唯一名稱的症狀。 – 2010-10-27 17:13:07

+0

這在setter方法中也很常見。 – ColinD 2010-10-27 17:14:35

0

除非使用關鍵字this將實例變量帶入作用域,否則方法中的局部作用域變量將優先於具有相同名稱的實例變量。

1

您可以使用this.card訪問實例變量。
this.variable引用將始終爲您提供實例變量。如果你對一個和實例變量相同的函數有一個參數,這會變得很有用,儘管我會建議儘可能地避免這個問題。

1

是的,本地範圍卡優先。您可以使用「這個」引用實例變量:

public void foo() { 
    Card card = new Card(); 
    this.card.test(); // tests the instance variable card 
    card.test(); // tests the local card 
} 
0

,你必須使用這個,如果你想在本地引用實例變量。