2011-11-24 57 views
-2

爲什麼我不能訪問我的變量pmull類的iterate方法?如何使公共靜態方法可以訪問實例變量?

public class mull { 
    public static void main(String[] args) throws InterruptedException { 
     final JPanel p = createAndShowGUI(); 

     Timer timer = new Timer(1000, new MyTimerActionListener()); 

    timer.start(); 
    try { 
     Thread.sleep(10000); 
    } catch (InterruptedException e) { 
    } 
    timer.stop(); 

public static void iterate(){ 

    for (int i = 0; i < 55; i++){ 
     // "p cannot be resolved" 
     p.moveSquare(i*10, i*10); 
     p.setParamsRing(i*5, i*7, 200, 200); 
    } 
    } 
} 

class MyPanel extends JPanel { 
.... 
} 

爲什麼Eclipse的強迫我用這個:

((MyPanel) p).setParamsRing(i*5, i*7, 200, 200); 

代替:

p.setParamsRing(i*5, i*7, 200, 200); 

+0

因爲p是JPanel類型,它沒有任何方法setParamsRing()。 – Tudor

+0

回答標題中的問題,因爲這是一個矛盾的詞彙。 – EJP

回答

3
  1. 靜態範圍只能訪問靜態變量。
  2. 除非您將其作爲參數傳遞給第二種方法,否則您無法訪問在另一方法中聲明的局部變量,或者使用全局可見性重新聲明它。

所以你需要的是:

public class mull { 
    private static final JPanel p; 

} 

編輯:和你的最後一個問題:這是因爲P是沒有任何方法setParamsRing類型JPanel的()。您可能在類MyPanel中添加了該方法。

0

爲了使靜態方法看到一個變量,它必須是靜態的或屬於一個類的實例。

非靜態變量屬於您沒有任何類的個別實例,因爲沒有調用new

靜態變量屬於Class本身。

你可以讓你的靜態變量或創建一個實例並訪問它的JPanel像
mull m = new mull();
m.p.moveSquare(...);

Eclipse的力量,你投,因爲p被聲明爲JPanel,因此它不具備setParamsRing()您可能在您的MyPanel類中引入的方法。

1

申報p作爲靜態字段添加到該類:

private static JPanel p; 
+0

它也應該是靜態的。 – Tudor

+0

@Tudor是的。 –

0

靜態方法只能訪問其他靜態方法和類成員。所以,定義你的p是靜態的。

順便說一句,你的班級似乎不是可編譯的。你有任何方法的代碼:

Timer timer = new Timer(1000, new MyTimerActionListener()); 

timer.start(); 
try { 
    Thread.sleep(10000); 
} catch (InterruptedException e) { 
} 
timer.stop(); 
相關問題