321 votes

Quelle est la raison derrière la « méthode non statique ne peut pas être référencée à partir d’un contexte statique » ?

L’erreur de débutant très courante est lorsque vous essayez d’utiliser une propriété de classe « statiquement » sans faire une instance de cette classe. Il vous laisse avec le message d’erreur mentionné.

Vous pouvez faire la méthode non statique statique ou faire une instance de cette classe à utiliser ses propriétés.

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

440voto

Brian Knoblauch Points 8747

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

85voto

Steven A. Lowe Points 40596

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

méthodes statiques appartiennent à la classe ; méthodes non statiques appartiennent aux instances de la classe

32voto

Michael Borgwardt Points 181658

L'essence de la programmation orientée objet est l'encapsulation de la logique avec les données qu'il exploite.

Les méthodes d'Instance sont la logique, des 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() );
    }
}

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

Sans objet, il n'existe pas de données d'instance, et alors que les méthodes d'instance exister en tant que partie de la définition de la classe, ils ont besoin d'une instance d'objet de fournir des données pour eux.

En théorie, une méthode d'instance qui n'a pas accès à toutes les données de l'instance pourrait fonctionner dans un contexte statique, mais alors il n'y a pas vraiment de raison pour qu'il 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.

15voto

Hugo Points 2156

Je viens de réaliser, je pense que les gens ne devraient pas être exposés à la notion de « statique » très tôt.

Méthodes statiques devraient probablement être l’exception plutôt que la norme. Surtout dès le début de toute façon si vous voulez apprendre la programmation orientée objet. (Pourquoi commencer par une exception à la règle ?) C’est très Counter-pédagogique de Java, que la « première » chose que vous devriez apprendre est la chose principale Sub publiques statiques . (Quelques applications réelles de Java ont leurs propres méthodes principales de toute façon.)

15voto

Erik Eidt Points 1397

Je pense qu'il est intéressant de souligner que les règles du langage Java, la Java compilateur insère l'équivalent de "ce." quand il détecte que vous êtes accédant à des méthodes d'instance ou d'instance champs sans explicite de l'instance. Bien sûr, le compilateur sait qu'il ne peut le faire à partir d'une méthode d'instance, qui a une variable "ce", comme les méthodes statiques ne le font pas.

Ce qui signifie que lorsque vous êtes dans une méthode d'instance suivantes sont équivalentes:

instanceMethod();
this.instanceMethod();

et ce sont aussi équivalentes:

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

Le compilateur est effectivement de l'insertion de la "cette." quand vous ne fournissez pas une instance spécifique.

Ce (pun intended) peu de "magie" par le compilateur peut dérouter les novices: il signifie qu'une instance appels et les appels statiques, parfois, semblent avoir la même syntaxe, alors qu'en réalité sont des appels de différents types et mécanismes sous-jacents.

L'instance d'appel de méthode est parfois appelée un appel de méthode ou de l'expédition, car les comportements des méthodes virtuelles soutenir le polymorphisme; expédition de comportement se produit indépendamment de savoir si vous avez écrit explicite de l'objet de l'instance à utiliser ou le compilateur inséré un ".".

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

Personnellement, je pense que le message d'erreur trompeur, il pouvait lire "non méthode statique ne peut pas être référencé à partir d'un contexte statique , sans spécification explicite d'une instance d'objet"

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