2017-09-19 2 views
-2

associée à

Cannot make a static reference to the non-static methodUtilisez une méthode non-statique à l'intérieur d'une classe interne d'une classe statique

Contexte

En traitement, j'utilise la méthode loadImage() à l'intérieur d'une classe interne. Traitement en désaccord:

Impossible de faire une référence statique à une méthode non statique loadImage (String) à partir du type PApplet

Si je fais la classe principale non-statique, puis, le message d'erreur disparaît. Je ne comprends pas pourquoi ma classe principale ne peut pas être statique, je ne veux pas l'instancier parce que je n'en ai pas besoin.

La classe interne est utilisée pour créer un tableau d'objets.

code

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

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

Où est défini 'nonStaticOtherMethod (foo)'? et vous savez peut-être que 'public nonStaticMethod (foo)' n'est pas une signature de méthode valide et vous y trouverez également des erreurs. –

+0

Ca vient d'une autre classe: PApplet –

+2

Je vous suggère de modifier votre question en ajoutant le code nécessaire pour reproduire votre scénario ou nous allons juste deviner. –

Répondre

0

À l'avenir, s'il vous plaît essayer de poster un MCVE. Le code que vous avez publié maintenant n'est pas une syntaxe valide et ne reflète pas vraiment ce que vous êtes en train de faire.

Quoi qu'il en soit, la fonction loadImage() n'est pas statique, donc vous ne pouvez pas le faire:

PApplet.loadImage("img.jpg"); 

Et il est également intéressant de noter que chaque sketch étend la classe PApplet, donc ceci:

PImage img; 

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

Est converti en code Java qui ressemble à ceci:

public class MySketch extends PApplet{ 
    PImage img; 

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

Ici, nous pouvons voir que la fonction loadImage() provient de la classe PApplet, que nous étendons.

Alors maintenant, vous avez quelque chose comme ceci:

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

    } 
} 

Ou quelque chose comme ceci:

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

    } 
} 

Dans les deux cas, cela va générer une erreur en disant que vous ne pouvez pas utiliser la non loadImage() statique à partir d'un contexte statique. En effet, la fonction loadImage() provient de l'instance elle-même. Vous avez besoin d'une instance pour utiliser une fonction non statique. Mais puisque la fonction getImage() est statique, elle n'appartient à aucune instance particulière. C'est pourquoi ça ne marche pas.

Si j'étais vous, je prendrais un peu de recul et vous demanderais pourquoi vous avez besoin de classes intérieures du tout.Si c'est une fonction statique, pourquoi ne pas simplement utiliser une fonction au niveau de l'esquisse?

+0

Je vous remercie, je dois admettre que ma question est vraiment mauvaise écrite, pas toujours facile de comprendre ce qui doit être ajouté. J'ai résolu mon problème simplement en rendant ma classe principale non statique et en l'instanciant comme vous le recommandez. Avec la (mauvaise) compréhension que j'ai de la POO, il est parfois difficile de distinguer les situations où vous n'avez pas besoin d'instance du tout quand vous n'en avez besoin que d'une seule. J'ai oublié de mentionner que toute cette classe est dans un deuxième onglet de mon projet de traitement, ce n'est pas un croquis. Tout est donc encapsulé dans une classe principale pour faciliter l'importation dans un nouveau projet. –

+0

@snoobdogg Les nouveaux onglets sont toujours convertis en classes internes, sauf si l'onglet se termine par '.java'. –

-1

Top Level Classes sont statiques alors le voir redondant et déroutant Specification Les classes internes sont par défaut non statique, vous pouvez les déclarer comme statique. Pour une méthode non statique, vous devez instancier un objet de classe choses d'autre viennent renverser vers le bas - :-)