在静态 class 的内部 class 中使用非静态方法

Use a non-static method inside a inner class of a static class

相关

Cannot make a static reference to the non-static method

上下文

在 Processing 中,我在内部 Class 中使用方法 loadImage()。处理不同意:

Cannot make a static reference to a non-static method loadImage(String) from the type PApplet

如果我使主要 class 成为非静态的,那么错误消息就会消失。我不明白为什么我的main class 不能是静态的,我不想实例化它,因为我不需要它。

内部class用于创建对象数组。

代码

class PApplet
{
    public loadImage(foo)
    {
        // ...
    }
}

static class MainStaticClass
{
    class InnerClass
    {
        public nonStaticMethod(foo)
        {
            return PApplet.loadImage(foo); // Error 
        }
    }
}

顶级 类 是静态的,所以它是多余的和令人困惑的,请参阅 Specification 内部 classes 默认是非静态的,您可以将它们声明为静态的。 对于非静态方法,您必须实例化一个 class 的对象,否则事情就会倒塌 - :-)

以后请努力post一个MCVE。您现在 post 编写的代码是无效语法,并不能真正反映您实际在做什么。

无论如何,loadImage()函数不是静态的,所以你不能这样做:

PApplet.loadImage("img.jpg");

同样值得注意的是,每个草图都扩展了 PApplet class,因此:

PImage img;

void setup(){
  img = loadImage("img.jpg");
}

转换为 Java 代码,如下所示:

public class MySketch extends PApplet{
  PImage img;

  void setup(){
    img = loadImage("img.jpg");
  }
}

在这里,我们可以看到 loadImage() 函数来自我们正在扩展的 PApplet class。

所以现在你有这样的东西:

public class MySketch extends PApplet{
  PImage img;

  void setup(){
    img = MyInnerClass.getImage("img.jpg");
  }

  class MyInnerClass{
    public static PImage getImage(String loc){
      return loadImage(loc);
    }

  }
}

或者像这样:

public class MySketch extends PApplet{
  PImage img;

  void setup(){
    img = new MyInnerClass().getImage("img.jpg");
  }

  static class MyInnerClass{
    public PImage getImage(String loc){
      return loadImage(loc);
    }

  }
}

在任何一种情况下,这都会产生一个错误,提示您不能从静态上下文中使用非静态 loadImage() 函数。

那是因为 loadImage() 函数来自实例本身。 您需要一个实例才能使用非静态函数。但是由于 getImage() 函数是静态的,它不属于任何特定实例。这就是它不起作用的原因。

如果我是你,我会退后一步问问自己为什么你需要内在的 classes。如果它是静态函数,那为什么不直接使用草图级别的函数呢?