2017-09-19 23 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內部類是通過默認的非靜態,​​你可以聲明爲靜態。 對於一個非靜態的方法,你必須實例化一個類的對象,否則的話事情就會降臨 - :-)

相關問題