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

时间:2017-09-19 14:52:45

标签: java oop static processing

相关

Cannot make a static reference to the non-static method

上下文

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

  

无法对非静态方法进行静态引用   来自PApplet类型的loadImage(String)

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

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

代码

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

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

2 个答案:

答案 0 :(得分:0)

将来,请尝试发布MCVE。您现在发布的代码不是有效的语法,并不能真正反映您实际所做的事情。

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

PApplet.loadImage("img.jpg");

并且值得注意的是,每个草图都扩展了PApplet类,所以这个:

PImage img;

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

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

public class MySketch extends PApplet{
  PImage img;

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

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

所以现在你有这样的事情:

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()函数是静态的,因此它不属于任何特定实例。这就是为什么它不起作用的原因。

如果我是你,我会退后一步,问问自己为什么你需要内部课程。如果它是静态函数,那么为什么不使用草图级函数?

答案 1 :(得分:-1)

顶级类是静态的,所以它的冗余和混乱看到Specification内部类默认是非静态的,你可以将它们声明为静态。 对于非静态方法,您必须实例化类的对象,否则事情就会崩溃 - : - )