2017-09-19 8 views
-2

Related to

Cannot make a static reference to the non-static methodeine nicht statische Methode in einer inneren Klasse einer statischen Klasse

Kontext verwenden

in der Verarbeitung, verwende ich die Methode loadimage() innerhalb einer inneren Klasse. Verarbeitung anderer Meinung:

Es kann keine statische Verweis auf eine nicht-statische Methode loadimage (String) vom Typ PApplet machen

Wenn ich die Hauptklasse nicht statisch zu machen, dann die Fehlermeldung verschwindet. Ich verstehe nicht, warum meine Hauptklasse nicht statisch sein kann, ich möchte sie nicht instanziieren, weil ich sie nicht brauche.

Die innere Klasse wird verwendet, um ein Array von Objekten zu erstellen.

-Code

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

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

Wo ist 'nonStaticOtherMethod (foo)' definiert? und Sie wissen vielleicht, dass 'public nonStaticMethod (foo)' keine gültige Methodensignatur ist und Sie auch dort Fehler erhalten. –

+0

Es kommt aus einer anderen Klasse: PApplet –

+2

Ich empfehle Ihnen, Ihre Frage zu bearbeiten, indem Sie den erforderlichen Code hinzufügen, um Ihr Szenario zu reproduzieren, oder wir werden nur raten. –

Antwort

0

In Zukunft versuchen Sie bitte, eine MCVE zu veröffentlichen. Der Code, den Sie jetzt gepostet haben, ist keine gültige Syntax und spiegelt nicht wirklich, was Sie tatsächlich tun.

Wie dem auch sei, die loadImage() Funktion ist nicht statisch, so können Sie dies nicht tun:

PApplet.loadImage("img.jpg"); 

Und es ist auch erwähnenswert, dass jede Skizze, die die PApplet-Klasse erweitert, so dass diese:

PImage img; 

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

Wird in Java-Code konvertiert, der wie folgt aussieht:

Hier können wir sehen, dass die loadImage() Funktion von der PApplet Klasse kommt, die wir erweitern.

So, jetzt etwas davon haben:

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); 
    } 

    } 
} 

Oder etwas Ähnliches:

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); 
    } 

    } 
} 

In jedem Fall wird dies sagen zu einem Fehler, dass Sie die nicht verwenden können, static loadImage() Funktion aus einem statischen Kontext.

Das liegt daran, dass die loadImage() Funktion von der Instanz selbst kommt. Sie benötigen eine Instanz, um eine nicht statische Funktion zu verwenden. Da die Funktion getImage() jedoch statisch ist, gehört sie keiner bestimmten Instanz an. Deshalb funktioniert es nicht.

Wenn ich Sie wäre, würde ich einen Schritt zurücktreten und sich fragen, warum Sie überhaupt innere Klassen brauchen.Wenn es sich um eine statische Funktion handelt, warum sollte man nicht einfach eine Sketch-Level-Funktion verwenden?

+0

Danke, ich muss zugeben, dass meine Frage wirklich schlecht geschrieben ist, nicht immer einfach herauszufinden, was hinzugefügt werden muss. Ich habe mein Problem gelöst, indem ich meine Hauptklasse nicht statisch gemacht habe und sie instanziiert habe, wie Sie es empfehlen. Mit dem (schlechten) Verständnis, das ich von OOP habe, ist es manchmal schwierig, Situationen zu unterscheiden, in denen du keine Instanz brauchst, als wenn du nur eine brauchst. Ich habe vergessen zu erwähnen, dass alle diese Klasse in einem zweiten Tab von meinem Verarbeitungsprojekt ist, es ist keine Skizze. Daher ist alles in einer Hauptklasse gekapselt, um den Import in ein neues Projekt zu erleichtern. –

+0

@snoobdogg Neue Registerkarten werden immer noch in innere Klassen konvertiert, außer die Registerkarte endet mit '.java'. –

-1

Top Level Klassen Statische sind so seine überflüssig und verwirrend sehen Specification Innere Klassen standardmäßig sind nicht statisch, können Sie sie als statische deklarieren. Für eine nicht statische Methode müssen Sie ein Objekt der Klasse instanziieren, sonst kommen die Dinge herunter -:

Verwandte Themen