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).
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.
Vous pouvez créer une instance de la classe sur laquelle vous souhaitez appeler la méthode, par exemple.
new Foo().nonStaticMethod();
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);
}
}
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.
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:
xInterface
) et une méthode statique. La méthode d'instance consistera en une seule ligne qui délègue à la méthode statique.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.
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*/
}
}
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.
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);
Il y a deux manières:
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.
Vous pouvez appeler une méthode non statique dans une méthode statique en utilisant: Classname.class.method()
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.
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é.