web-dev-qa-db-fra.com

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

Je reçois 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 du type playback

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

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

Existe-t-il un moyen d'éviter d'appeler une méthode non statique dans une autre méthode statique? (Les deux méthodes sont dans des packages séparés et des classes séparées).

107
me123

Le seul moyen d'appeler une méthode non statique à partir d'une méthode statique consiste à avoir une instance de la classe contenant la méthode non statique. Par définition, une méthode non statique est une méthode appelée ON une instance d'une classe, alors qu'une méthode statique appartient à la classe elle-même.

125
danben

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

new Foo().nonStaticMethod();
85
Fabian Steeg

Commencez par créer une instance de classe et appelez la méthode non statique à l'aide de cette instance. 

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);
    }
}
39
Parmeshwar
public class StaticMethod{

    public static void main(String []args)throws Exception{
        methodOne();
    }

    public int methodOne(){
        System.out.println("we are in first methodOne");
        return 1;
    }
}

le code ci-dessus n'est pas exécuté car la méthode statique doit avoir cette référence de classe.

public class StaticMethod{
    public static void main(String []args)throws Exception{

        StaticMethod sm=new StaticMethod();
        sm.methodOne();
    }

    public int methodOne(){
        System.out.println("we are in first methodOne");
        return 1;
    }
}

Ce sera certainement se faire exécuter. Parce que nous créons ici une référence qui ne fait que "sm" en utilisant cette référence de cette classe qui n’est rien Mais (StaticMethod=new Static method()) nous appelons la méthode un (sm.methodOne()). 

J'espère que cela vous sera utile.

8
chinnu geddi

Il semble que la méthode devrait être statique (c’est-à-dire qu’elle n’accède à aucun membre de données et qu’elle n’a pas besoin d’être invoquée). Puisque vous avez utilisé le terme "classe statique", je comprends que toute la classe est probablement dédiée à des méthodes de type utilitaire pouvant être statiques.

Cependant, Java n'autorise pas la mise en œuvre statique d'une méthode définie par une interface. Ainsi, lorsque vous essayez (naturellement) de rendre la méthode statique, vous obtenez l'erreur "impossible de masquer la méthode de l'instance". (La spécification du langage Java le mentionne dans Section 9.4 : "Notez qu'une méthode déclarée dans une interface ne doit pas être déclarée statique, sinon une erreur de compilation se produit, car les méthodes statiques ne peuvent pas être abstraites." )

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

Si vous ne pouvez pas modifier l'interface (ou ne souhaitez pas le faire), vous pouvez procéder de différentes manières:

  • Faites de la classe un singleton: rendez le constructeur privé et disposez d'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 devrez appeler la méthode.
  • Implémentez 2 méthodes dans votre classe: une méthode d'instance (telle que définie dans xInterface) et une méthode statique. La méthode d'instance consistera en une seule ligne qui délègue à la méthode statique.
6
Eli Acherkan

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

C'est comme lorsque vous essayez d'appeler 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, puis d'appeler la méthode non statique:

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

Donc, vous devez créer et instance pour l'invoquer. 

5
OscarRyz

Le seul moyen d'appeler une méthode non statique à partir d'une méthode statique consiste à avoir une instance de la classe contenant la méthode non statique.

class A
{
    void method()
    {
    }
}
class Demo
{
    static void method2()
    {
        A a=new A();

        a.method();
    }
    /*
    void method3()
    {
        A a=new A();
        a.method();
    }
    */

    public static void main(String args[])
    {
        A a=new A();
        /*an instance of the class is created to access non-static method from a static method */
        a.method();

        method2();

        /*method3();it will show error non-static method can not be  accessed from a static method*/
    }
}
2
Sourav Saha

J'utilise une interface et crée une instance anonyme, comme ceci:

AppEntryPoint.Java

public interface AppEntryPoint
{
    public void entryMethod();
}

Main.Java

public class Main
{
    public static AppEntryPoint entryPoint;

    public static void main(String[] args)
    {
        entryPoint = new AppEntryPoint()
        {

            //You now have an environment to run your app from

            @Override
            public void entryMethod()
            {
                //Do something...
                System.out.println("Hello World!");
            }
        }

        entryPoint.entryMethod();
    }

    public static AppEntryPoint getApplicationEntryPoint()
    {
        return entryPoint;
    }
}

Pas aussi élégant que de créer une instance de cette classe et d'appeler sa propre méthode, mais accomplit essentiellement la même chose. Juste une autre façon de le faire.

1

Le moyen le plus simple d'utiliser une méthode/un champ non statique dans une méthode statique ou inversement est ...

(Pour que cela fonctionne, il doit y avoir au moins une instance de cette classe)

Ce type de situation est très courant dans le développement d'applications Android, par exemple: - Une activité a au moins une instance.

public class ParentClass{

private static ParentClass mParentInstance = null;

ParentClass(){
  mParentInstance = ParentClass.this;           
}


void instanceMethod1(){
}


static void staticMethod1(){        
    mParentInstance.instanceMethod1();
}


public static class InnerClass{
      void  innerClassMethod1(){
          mParentInstance.staticMethod1();
          mParentInstance.instanceMethod1();
      }
   }
}

Remarque: - Cela ne peut pas être utilisé comme méthode de construction comme celle-ci .....

String.valueOf(100);
1
mifthi

Il y a deux manières:

  1. Appelez la méthode non statique à partir d'une instance de la méthode statique. Voir la réponse de fabien pour un échantillon oneliner ... bien que je le déconseille vivement. Avec son exemple, il crée une instance de la classe et ne l'utilise que pour une méthode. Je ne le recommande pas car il traite une instance comme une fonction statique. 
  2. Modifier la méthode statique à une non statique. 
1
monksy

Vous ne pouvez pas contourner cette restriction directement, non. Mais vous pouvez faire certaines choses raisonnables dans votre cas particulier.

Par exemple, vous pouvez simplement "créer" une instance de votre classe dans la méthode statique, puis appeler la méthode non statique.

Mais vous pourriez obtenir des suggestions encore meilleures si vous postez vos classes - ou une version simplifiée de celles-ci.

1
Drew Wills

Vous pouvez appeler une méthode non statique dans une méthode statique en utilisant: Classname.class.method()

0
george kanakis

Constructor est une méthode spéciale qui, en théorie, est la "seule" méthode non statique appelée par une méthode statique. sinon ce n'est pas permis.

0
JavaDeveloper

Il n'est pas possible d'appeler une méthode non statique dans une méthode statique. La logique derrière cela est que nous ne créons pas d'objet pour instancier une méthode statique, mais nous devons créer un objet pour instancier une méthode non statique. Donc, la méthode non statique n'obtiendra pas d'objet pour son instanciation dans la méthode statique, le rendant ainsi incapable d'être instancié. 

0
Usman