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

Java 如何使实例变量可供公共静态方法访问?,java,Java,为什么我不能在mull类的iterate方法中访问变量p public class mull { public static void main(String[] args) throws InterruptedException { final JPanel p = createAndShowGUI(); Timer timer = new Timer(1000, new MyTimerActionListener()); timer.st

为什么我不能在
mull
类的
iterate
方法中访问变量
p

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 {
....
}
而不是:

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

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

非静态变量属于一个类的单个实例,您没有此类实例,因为不需要调用
new

静态变量属于
类本身

您可以将变量设为静态变量,也可以创建一个实例并访问它,就像JPanel一样
mull m=new mull()

m、 p.moveSquare(…)


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

p
声明为类的静态字段:

private static JPanel p;
  • 静态作用域只能访问静态变量
  • 除非将局部变量作为参数传递给第二个方法或使用全局可见性重新声明,否则无法从另一个方法访问在方法中声明的局部变量
  • 因此,您需要的是:

    public class mull {
        private static final JPanel p;
    
    }
    

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

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

    顺便说一句,您的类似乎不可编译。您可以使用以下任何方法生成代码:

        Timer timer = new Timer(1000, new MyTimerActionListener());
    
    timer.start();
    try {
      Thread.sleep(10000);
    } catch (InterruptedException e) {
    }
    timer.stop();
    

    因为p是JPanel类型,它没有任何方法setParamsRing()。来回答标题中的问题,因为它在术语上是矛盾的。
        Timer timer = new Timer(1000, new MyTimerActionListener());
    
    timer.start();
    try {
      Thread.sleep(10000);
    } catch (InterruptedException e) {
    }
    timer.stop();