如何使公共静态方法可以访问实例变量?

时间:2011-11-24 17:42:16

标签: java

为什么我无法在p班级的mull方法中访问我的变量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);

4 个答案:

答案 0 :(得分:3)

  1. 静态范围只能访问静态变量。
  2. 除非将其作为参数传递给第二种方法,或者使用全局可见性重新声明它,否则无法从其他方法访问方法内声明的局部变量。
  3. 所以你需要的是:

    public class mull {
        private static final JPanel p;
    
    }
    

    编辑:还有你的上一个问题:这是因为p是JPanel类型,它没有任何方法setParamsRing()。您可能在MyPanel类中添加了该方法。

答案 1 :(得分:1)

p声明为类的静态字段:

private static JPanel p;

答案 2 :(得分:0)

为了使静态方法能够看到变量,它必须是静态的或属于类的实例。

非静态变量属于某个类的单个实例,因为没有调用new,所以它们都没有。

静态变量属于Class本身。

您可以将变量设置为静态或创建实例并访问它的JPanel     
mull m = new mull();
m.p.moveSquare(...);

Eclipse会强制您进行强制转换,因为p被声明为JPanel,因此它没有您在setParamsRing()类中引入的MyPanel方法。

答案 3 :(得分:0)

静态方法只能访问其他静态方法和类成员。因此,将p定义为静态。

BTW你的课程似乎不可编辑。你有任何方法的代码:

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

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