Quelle est la raison derrière "la méthode non-statique ne peut pas être référencée à partir d'un contexte statique"? [dupliquer]

cette question a déjà une réponse ici:

l'erreur très commune de débutant est quand vous essayez d'utiliser une propriété de classe" statique " sans faire une instance de cette classe. Il vous laisse avec le message d'erreur mentionné:

vous pouvez soit rendre statique la méthode non statique ou faire une instance de cette classe pour utiliser ses propriétés.

pourquoi? Je ne demande pas des solutions. Je vous serais reconnaissant de savoir quelle est la raison derrière elle. Le cœur de la raison!

private java.util.List<String> someMethod(){
    /* Some Code */
    return someList;            
}

public static void main(String[] strArgs){          
     // The following statement causes the error. You know why..
    java.util.List<String> someList = someMethod();         
}
198
demandé sur Ivan Gerasimenko 2008-11-14 20:59:30

13 réponses

Vous ne pouvez pas appeler quelque chose qui n'existe pas. Puisque vous n'avez pas créé un objet, non méthode statique n'existe pas encore. Une méthode statique (par définition) existe toujours.

284
répondu Brian Knoblauch 2008-11-14 18:10:50

la méthode que vous essayez d'appeler est une méthode de niveau d'instance; vous n'avez pas d'instance.

static méthodes appartiennent à la classe, et non static méthodes appartiennent à des instances de la classe.

47
répondu Steven A. Lowe 2016-10-22 19:46:56

l'essence de la programmation orientée objet est d'encapsuler la logique avec les données sur lesquelles elle opère.

les méthodes D'Instance sont la logique, les champs d'instance sont les données. Ensemble, ils forment un objet.

public class Foo
{
    private String foo;
    public Foo(String foo){ this.foo = foo; }
    public getFoo(){ return this.foo; }

    public static void main(String[] args){
        System.out.println( getFoo() );
    }
}

quel pourrait être le résultat de l'exécution du programme ci-dessus?

Sans objet, il n'y a pas de données d'instance, et bien que les méthodes d'instance fassent partie de la définition de classe, elles ont besoin une instance objet pour fournir des données pour eux.

en théorie, une méthode d'instance qui n'accède à aucune donnée d'instance pourrait fonctionner dans un contexte statique, mais alors il n'y a pas vraiment de raison pour qu'elle soit une méthode d'instance. C'est une langue décision de conception pour permettre de toute façon, plutôt que de faire une règle pour l'interdire.

20
répondu Michael Borgwardt 2009-07-16 21:30:10

je viens de réaliser, je pense que les gens ne devraient pas être exposés au concept de" statique " très tôt.

méthodes Statiques devrait probablement être l'exception plutôt que la norme. Surtout si vous voulez apprendre L'OOP. (Pourquoi commencer par une exception à la règle? 151930920 "static void main thing. (Peu D'applications Java réelles ont leur propre main les méthodes de toute façon.)

12
répondu Hugo 2008-11-15 07:28:36

je pense qu'il vaut la peine de souligner que par les règles du langage Java le compilateur Java insère l'équivalent de" ceci."quand il remarque que vous accédez à des méthodes d'instance ou à des champs d'instance sans une instance explicite. Bien sûr, le compilateur sait qu'il ne peut le faire qu'à partir d'une méthode d'instance, qui a une variable "ceci", comme les méthodes statiques ne le font pas.

ce qui signifie que lorsque vous êtes dans une méthode d'instance les suivants sont équivalents:

instanceMethod();
this.instanceMethod();

et ceux-ci sont également équivalents:

... = instanceField;
... = this.instanceField;

le compilateur insère effectivement le" Ceci."quand vous ne fournissez pas une instance spécifique.

ce bit d ' "aide magique" du compilateur peut induire en erreur les novices: cela signifie que les appels d'instance et les appels statiques semblent parfois avoir la même syntaxe alors qu'en réalité ce sont des appels de différents types et mécanismes sous-jacents.

l'appel de méthode d'instance est parfois appelé une invocation ou une expédition de méthode en raison des comportements des méthodes virtuelles supportant le polymorphisme; le comportement de dispatching se produit indépendamment du fait que vous ayez écrit une instance d'objet explicite à utiliser ou que le compilateur ait inséré un" Ceci.".

le mécanisme d'appel de méthode statique est plus simple, comme un appel de fonction dans un langage non-OOP.

personnellement, je pense que le message d'erreur est trompeur, il pourrait se lire " la méthode non statique ne peut pas être référencée à partir d'un contexte statique sans spécifier une instance d'objet explicite ".


ce dont se plaint le compilateur, c'est qu'il ne peut pas simplement insérer la norme " ceci."comme il le fait dans les méthodes d'instance, parce que ce code est dans une méthode statique; cependant, peut-être l'auteur a simplement oublié de fournir l'instance d'intérêt pour cette invocation-disons, une instance peut-être fourni à la méthode statique comme paramètre, ou créé dans cette méthode statique.

en bref, vous pouvez très certainement appeler des méthodes d'instance à partir d'une méthode statique, vous avez juste besoin d'avoir et de spécifier un objet d'instance explicite pour l'invocation.

11
répondu Erik Eidt 2018-01-24 17:42:23

les réponses jusqu'à présent décrivent pourquoi, Mais voici une autre chose que vous pourriez vouloir considérer:

vous pouvez appeler une méthode à partir d'une classe instantiable en ajoutant un appel de méthode à son constructeur,

Object instance = new Constuctor().methodCall();

ou

primitive name = new Constuctor().methodCall();

c'est utile si vous souhaitez utiliser une méthode d'une classe instanciable une seule fois dans une portée unique. Si vous appelez plusieurs méthodes d'une classe instanciable dans un simple scope, crée définitivement une instance référable.

4
répondu Ande 2009-04-07 13:48:10

si nous essayons d'accéder à une méthode d'instance à partir d'un contexte statique , le compilateur n'a aucun moyen de deviner quelle méthode d'instance ( variable pour quel objet ), vous faites référence. Cependant, vous pouvez toujours y accéder en utilisant une référence d'objet.

3
répondu Vivek Vermani 2016-03-06 21:20:19

le compilateur ajoute en fait un argument aux méthodes non statiques. Il ajoute un this pointer/reference. This is also the reason why a static method can not use this , parce qu'il n'y a pas d'objet.

2
répondu 2009-04-08 12:39:58

Une méthode statique concerne une action à un type d'objet, tandis que les non méthode statique concerne un recours à une instance de ce type d'objet. Typiquement c'est une méthode qui fait quelque chose en relation avec l'instance.

Ex:

Les wagons de la catégorie

pourraient avoir une méthode de lavage, ce qui indiquerait le lavage d'un wagon particulier, tandis qu'une méthode statique s'appliquerait aux wagons de la catégorie

.

1
répondu Robin 2008-11-14 18:11:16

si une méthode n'est pas statique, cela "dit" au compilateur que la méthode nécessite l'accès aux données au niveau de l'instance dans la classe, (comme un champ non statique). Ces données ne seraient pas disponibles à moins qu'une instance de la classe a été créée. Ainsi, le compilateur génère une erreur si vous essayez d'appeler la méthode à partir d'une méthode statique.. Si, en fait, la méthode ne fait référence à aucun membre non statique de la classe, rendez la méthode statique.

dans Resharper, par exemple, juste la création d'une méthode non statique qui ne fait référence à aucun membre statique de la classe génère un message d'Avertissement "Cette méthode peut être rendue statique"

1
répondu Charles Bretana 2008-11-14 18:11:50

la raison simple derrière ceci est que les données statiques membres de la classe de parent peut être accédé (seulement s'ils ne sont pas dépassés) mais par exemple(non-statique) les données membres et méthodes nous avons besoin de leur référence et donc ils ne peuvent être appelée par un objet.

0
répondu Vipul 2014-01-08 19:10:31

donc vous demandez pour une raison essentielle?

Eh bien, puisque vous développez en Java, le compilateur génère un code objet que la machine virtuelle Java peut interpréter. La JVM est en tout cas un programme binaire qui s'exécute en langage machine (probablement la version de la JVM spécifique à votre système d'exploitation et à votre matériel a déjà été compilée par un autre langage de programmation comme C afin d'obtenir un code machine qui peut s'exécuter dans votre processeur). À la fin, n'importe quel code est traduit en code machine. Ainsi, créer un objet (une instance d'une classe) est équivalent à réserver un espace mémoire (des registres de mémoire qui seront des registres de processeur lorsque le programmeur CPU du système d'exploitation met votre programme en haut de la file d'attente afin de l'Exécuter) pour avoir un lieu de stockage de données qui peut être capable de lire et d'écrire des données. Si vous n'avez pas une instance d'une classe (ce qui arrive sur un contexte statique), alors vous n'avez pas d'espace mémoire pour lire ou écrire les données. Effectivement, comme d'autres personnes l'ont dit, les données n'existent pas (parce que depuis le début vous n'avait jamais écrit, ni avions réservé l'espace mémoire pour stocker).

Désolé pour mon anglais! Je suis latine!

0
répondu Cristián Munizaga 2014-08-20 21:48:24

non méthode statique dépend de l'objet. Il est reconnu par le logiciel, une fois que l'objet est créé.

Statique méthodes peuvent être appelées avant même la création d'un objet. Les méthodes statiques sont excellentes pour faire des comparaisons ou des opérations qui ne dépendent pas des objets réels que vous prévoyez de travailler avec.

0
répondu Ejesalva 2014-09-13 15:10:07