2012-12-12 183 views
3

我需要修改內部類的變量。編譯器說我需要聲明變量static,但是我不能修改它。該代碼是這樣的:訪問java中內部類的變量

public class Outter{ 
    private boolean b; 

    public Outter(){ 
     b = false; 
     new Inner(b); 
    } 
} 

public class Inner{ 
    public Inner(boolean b){ 
     b = true; 
    } 
} 

有沒有像C中的「外部」什麼?或者任何解決方案,所以我可以修改b變量?我已經嘗試將其設置爲靜態並將整個Outter類作爲參數傳遞,但我仍然遇到同樣的問題。

編輯: 好代碼更像是:

public class MainView{ 
    private boolean view; 
    //JMenus,JMenuItems, JPanels.. declarations 
    private JFrame frame 
    MainView(){ 
    view = true; 
    //initializations 
    create_listeners(); 
    } 
    public void create_listeners(){ 
     Menu.addActionListener(
     new ActionListener() { 
      public void actionPerformed(ActionEvent event){ 
       if(View){ 
        new View2(frame); 
        View = false; 
       } 
      } 

     } 
    ); 
    } 
} 

public class View2{ 
    private JButton back = new JButton("Back"); 
    public View2(JFrame frame){ 
    //initialitzatons 
    create_listeners(); 
} 
    public void create_listeners(){ 
      back.addActionListener(
     new ActionListener() { 
      public void actionPerformed(ActionEvent event){ 
       frame.remove(MainPanel); 
       View = true;// HERE, i want to modify the variable 
       } 

     } 
    ); 
    } 
} 

的問題是我應該怎麼從視圖2類修改變量「視圖」。

對不起,製表不好,我做得很快,需要翻譯代碼。

+0

看看類似問題的回覆:http://stackoverflow.com/questions/6830637/what-is-the-equivalent-keyword-for-extern-in-java – sglahn

回答

6

的語法如下,您獲得使用Outter.this

public class Outter{ 
    private boolean b; 

    class Inner{ 
     public Inner(boolean b){ 
      Outter.this.b = true; 
     } 
    } 
} 

編輯外部類的參考:在我看來,你是想只是傳遞引用修改灣在java中這是不可能的。變量作爲參數通過引用變量的副本傳遞(引用變量類似於指針),或者在基元的情況下通過複製傳遞。

+0

是否有任何其他解決方案通過引用傳遞它?我的意思是內部類是從外部進入文件的一部分,而外部則是內部進程。在C/C++中,使用extern很容易,但我不知道如何在java中完成。 – user1897262

+0

Outter必須有一個具有布爾值的對象(例如,帶有setter的java bean)。然後,它可以將對該對象的引用傳遞給Inner,並且Inner可以更改布爾值的值(使用setter來設置新值)。我認爲這對於C語言背景的人看起來有點矯枉過正,但是經過多年的發展,我個人已經開始體會到這種更簡單明瞭的編程風格。 – dkateros

+0

因此,我應該創建另一個「迷你類」,其中包含一個布爾值和set/get函數,並將其作爲此類的參數傳遞,而不是布爾值。 – user1897262

3

您正在尋找的東西,如:

public class Outer { 
    // Using atomic because it is a convenient mutable boolean. 
    private final AtomicBoolean b = new AtomicBoolean(); 

    public Outer() { 
    b.set(true); 
    new Inner(); 
    } 

    public class Inner { 
    public Inner() { 
     b.set(false); 
    } 
    } 
} 
+1

雖然它起作用,但在這裏看起來*少許*過度(並且不必要)! – assylias

2

首先,你的內部類的外部類外,把它在外部類中

public class Outter{ 
    private boolean b; 

    public Outter(){ 
     b = false; 
     new Inner(b); 
    } 
    public class Inner{ 
     public Inner(boolean b){ 
      b = true; 
     } 
    } 
    public static void main(String[] args) { 
     System.out.println(new Outter().b); 
    } 
} 

的Java變量傳遞(包括原語和參考)通過,不通過引用,內部類中的變量b是一個seperate new variable。在您的代碼中,您正在修改值在內部類中聲明的b不是外部類。如果要修改的outer classb價值,做這樣的事情:

public class Outter{ 
    private boolean b; 

    public Outter(){ 
     b = false; 
     new Inner(); 
    } 
    public class Inner{ 
     public Inner(){ 
      b = true; 
     } 
    } 
    public static void main(String[] args) { 
     System.out.println(new Outter().b); 
    } 
} 
+0

事實上,我的意圖是,內部類在外部,在一個文件除外,因爲我有一些類似的內部類,所有他們卡在外部將是一個如此龐大的類。 – user1897262

+1

**事實上,我的意圖是內層類在外層,外層不是內層類,如果你在外層類之外聲明,它就是一個單獨的外層類。 – PermGenError

+0

然後,爲什麼編譯器會這樣說:局部變量b是從內部類中訪問的;需要宣佈最終? – user1897262

0

你的代碼也是正確的,因爲Java doesn't pass variables by reference; it passes them by value.

+0

你的陳述很容易被許多人誤解。 –

+0

@VikramSingh怎麼這樣? – PermGenError

0

您的編輯之後,它似乎,也許你正在尋找的是一個interface 。這種模式可以成爲你想要的嗎?

public interface Viewable { 
    public void setViewed (boolean viewed); 
    public boolean isViewed(); 
} 

class Outer implements Viewable { 
    private boolean viewed = false; 

    @Override 
    public boolean isViewed() { 
    return viewed; 
    } 

    @Override 
    public void setViewed(boolean viewed) { 
    this.viewed = viewed; 
    } 

} 

class Inner { 
    public Inner (Viewable view) { 
    view.setViewed(true); 
    } 
} 

Inner inner = new Inner(new Outer()); 

我選擇OuterInner類名稱與原來的問題連接。你會發現更好的名字。

+0

感謝您的幫助,我會盡快將其添加到我的代碼中。 – user1897262