2017-09-19 219 views
-2

相关的内部

Cannot make a static reference to the non-static method使用非静态方法中的内部类的静态类

语境

在处理中,我使用的方法的LoadImage()的一个内部类的内部。处理不同意:

无法使静态参考从类型PApplet

非静态方法 的LoadImage(字符串)如果我让主类非静态,然后,将错误消息消失。我不明白为什么我的主类不能是静态的,我不想实例化它,因为我不需要它。内部类用于创建对象数组。

代码

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

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

'nonStaticOtherMethod(foo)'定义在哪里?你可能知道'public nonStaticMethod(foo)'不是一个有效的方法签名,你也会在那里得到错误。 –

+0

它来自另一个类:PApplet –

+2

我建议你编辑你的问题,添加必要的代码来重现你的场景,或者我们只是猜测。 –

回答

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

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

+0

谢谢,我必须承认,我的问题写得很糟糕,并不总是容易找出必须添加的内容。我简单地通过让我的主类非静态并按照你的建议实例化来解决我的问题。有了OOP的(糟糕的)理解,有时候很难区分你根本不需要实例的情况,而不是仅仅需要实例的情况。我忘了提及所有这个课程都在我的处理项目的第二个选项卡中,它不代表草图。因此,所有内容都被封装在一个主类中,以便于在新项目中导入。 –

+0

@snoobdogg新选项卡仍然转换为内部类,除非选项卡以'.java'结尾。 –

-1

顶级类是静态所以它的冗余和混乱看到Specification内部类是通过默认的非静态,​​你可以声明为静态。 对于一个非静态的方法,你必须实例化一个类的对象,否则的话事情就会降临 - :-)

相关问题