2016-03-15 21 views
0

我不知道爲什麼變量n不是第二個偵聽可見。一切都在問題中。下面我添加一個代碼。這只是所有源代碼的一部分。爲什麼變量n在Java中的第二個偵聽器中不可見?

ActionListener lis5 = new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
     String a = t1.getText(); 
     int n = Integer.parseInt(a); 
    } 
}; 
b1.addActionListener(lis5); 

ActionListener lis6 = new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
     int [] tab = new int[n]; 
     for (int i=0;i<n;i++) { 
      tab[i] = in.nextInt(); 
     } 
    } 
}; 
b2.addActionListener(lis6); 
+0

一個變量的範圍被限制在'{ '和'}'它在一邊。 –

+0

可能重複[如何在另一個方法中使用一個方法的變量?](http://stackoverflow.com/questions/9351955/how-to-use-a-variable-of-one-method-in-another - 方法) – Ben

回答

1

因爲n在anonymous interface的範圍內。

  • 訪問封閉範圍內的局部變量和聲明和匿名類
  • 像本地類,匿名類可以捕捉變量訪問成員;他們有 對封閉範圍的本地變量的訪問權限相同:

    一個匿名類可以訪問其封閉類的成員。

    匿名類不能在未聲明爲final或者有效最終其封閉 範圍內訪問局部變量。

    與嵌套類一樣, 中的類型聲明(例如變量),匿名類會隱藏封閉的 作用域中具有相同名稱的任何其他聲明。有關更多信息,請參閱陰影。

    匿名類也有同樣的限制,本地類 相對於他們的成員:

    在 匿名類你不能聲明靜態初始化或成員接口。

    匿名類可以有靜態成員,條件是它們 常數變量。

    1

    n在第一個actionPerformed的範圍內聲明。一旦方法結束,它將「消失」。

    聲明它的方法

    int n = 0; 
    
    ActionListener lis5 = new ActionListener() { 
        public void actionPerformed(ActionEvent e) { 
         String a = t1.getText(); 
         n = Integer.parseInt(a) 
        } 
    }; 
    b1.addActionListener(lis5); 
    
    int[] tab; 
    
    ActionListener lis6 = new ActionListener() { 
        public void actionPerformed(ActionEvent e) { 
         tab = new int[n]; 
         for(int i = 0 ; i < n ; i++) { 
          tab[i] = in.nextInt(); 
         } 
        } 
    }; 
    b2.addActionListener(lis6); 
    

    也是一樣tab陣列的減速之外。

    +0

    THX,我怎麼能解決這個問題? – belusa16

    +0

    @ belusa16我將此添加到我的回答。 – Guy

    +0

    謝謝,但你能糾正我的代碼,因爲我仍然不知道我能做什麼嗎? – belusa16

    0

    如果您需要能夠更新一個動作偵聽器中的變量,然後在另一個動作偵聽器中使用它,則需要引用可變值類型以在兩者之間共享。

    可以簡單地使用int[1],但我更喜歡使用AtomicInteger,因爲它是更清楚的是,恰好被共享的一個整數值,那麼:

    final AtomicInteger n = new AtomicInteger(); 
    ActionListener lis5 = new ActionListener(){ 
        public void actionPerformed(ActionEvent e) { 
         String a = t1.getText(); 
         n.set(Integer.parseInt(a)); 
        } 
    }; 
    b1.addActionListener(lis5); 
    
    ActionListener lis6 = new ActionListener(){ 
        public void actionPerformed(ActionEvent e) { 
         int nn = n.get(); 
         int [] tab = new int[nn]; 
         for(int i=0;i<nn;i++){ 
          tab[i] = in.nextInt(); 
         } 
        } 
    }; 
    b2.addActionListener(lis6); 
    
    +0

    好的,這是明確的感謝;我有第二個問題。我想要寫程序在t1(TextField)中輸入用戶想要輸入的數字,並用b1(Button)進行確認。在t2(TextField)中,用戶輸入第一個值,然後按b2輸入,然後在下一次用戶輸入第二個值並再次輸入b2。它發生了很多次,高達n(來自第一位聽衆)。我怎麼必須從Andy Turner更改代碼來執行該程序,但是現在,當我給t2第一個值並按下按鈕時,仍然按下b2。 – belusa16

    +0

    您的其他問題很不明確(特別是在註釋中提供的格式) ,加上像這樣的車手問題並不是特別好的形式。我建議你把它作爲一個單獨的問題。 –

    相關問題