139 votes

Appel d'une méthode non statique dans une méthode statique en Java

J'obtiens une erreur lorsque j'essaie d'appeler une méthode non statique dans une classe statique.

Impossible de faire une référence statique à la méthode non statique methodName() à partir de la lecture du type

Je ne peux pas rendre la méthode statique car cela me donne également une erreur.

Cette méthode statique ne peut pas cacher la méthode d'instance de xInterface

Existe-t-il un moyen de contourner l'appel d'une méthode non statique dans une autre méthode statique ? (Les deux méthodes sont dans des paquets distincts et des classes distinctes).

168voto

danben Points 35312

La seule façon d'appeler une méthode non statique à partir d'une méthode statique est d'avoir une instance de la classe contenant la méthode non statique. Par définition, une méthode non statique est une méthode qui est appelée sur une instance d'une classe, alors qu'une méthode statique appartient à la classe elle-même.

107voto

Fabian Steeg Points 24261

Vous pouvez créer une instance de la classe sur laquelle vous voulez appeler la méthode, par exemple

new Foo().nonStaticMethod();

1 votes

@EJP Pour des raisons de sécurité, et c'est ce que je fais avec mon projet, dans le cas de l'injection de dépendances, il est utile que le code d'initialisation ne soit instancié que pour l'initialisation, et non à la discrétion arbitraire du code utilisant mon API. Ainsi, lorsqu'un cycle d'initialisation se produit, l'objet temporaire contenant uniquement des constantes et des méthodes non statiques qui sont initialisées dynamiquement par l'injection de dépendances peut être chargé et éliminé en toute sécurité selon les besoins. L'objectif des méthodes statiques ressemble davantage à celui des fonctions "pures", comme dans les langages de programmation fonctionnelle.

68voto

Parmeshwar Points 151

Créez d'abord une instance de classe et appelez la méthode non statique en utilisant cette instance. Par exemple

class demo {

    public static void main(String args[]) {
        demo d = new demo();
        d.add(10,20);     // to call the non-static method
    }

    public void add(int x ,int y) {
        int a = x;
        int b = y;
        int c = a + b;
        System.out.println("addition" + c);
    }
}

7voto

OscarRyz Points 82553

Vous avez besoin d'une instance de la classe contenant la méthode non statique.

C'est comme lorsque vous essayez d'invoquer la méthode non statique startsWith de la classe String sans instance :

 String.startsWith("Hello");

Ce dont vous avez besoin, c'est d'avoir une instance et d'invoquer la méthode non statique :

 String greeting = new String("Hello World");
 greeting.startsWith("Hello"); // returns true 

Vous devez donc créer une instance pour l'invoquer.

7voto

Eli Acherkan Points 3957

On dirait que la méthode a vraiment devrait être statique (c'est-à-dire qu'elle n'accède à aucun membre de données et qu'elle n'a pas besoin d'une instance pour être invoquée). Puisque vous avez utilisé le terme "classe statique", je comprends que la classe entière est probablement dédiée aux méthodes de type utilitaire qui pourraient être statiques.

Cependant, Java ne permet pas à l'implémentation d'une méthode définie par une interface d'être statique. Ainsi, lorsque vous essayez (naturellement) de rendre la méthode statique, vous obtenez l'erreur "cannot-hide-the-instance-method". (La spécification du langage Java mentionne ceci dans section 9.4 : "Notez qu'une méthode déclarée dans une interface ne doit pas être déclarée statique, sous peine de provoquer une erreur de compilation, car les méthodes statiques ne peuvent pas être abstraites." )

Ainsi, tant que la méthode est présente dans xInterface et votre classe implémente xInterface vous ne pourrez pas rendre la méthode statique.

Si vous ne pouvez pas changer l'interface (ou si vous ne voulez pas le faire), il y a plusieurs choses que vous pouvez faire :

  • Faites de la classe un singleton : rendez le constructeur privé, et ayez un membre de données statique dans la classe pour contenir la seule instance existante. De cette façon, vous invoquerez la méthode sur une instance, mais au moins vous ne créerez pas de nouvelles instances à chaque fois que vous aurez besoin d'appeler la méthode.
  • Implémentez 2 méthodes dans votre classe : une méthode d'instance (telle que définie dans la section xInterface ), et une méthode statique. La méthode d'instance sera constituée d'une seule ligne qui délègue à la méthode statique.

0 votes

Une réponse très avancée ! Merci !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X