Correction: la méthode non statique ne peut pas être référencée à partir d'un contexte statique

De nombreux programmeurs sont confrontés au message d'erreur " Les méthodes non statiques ne peuvent pas être référencées à partir d'un contexte statique " lors de la programmation. Ce message d'erreur n'est pas spécifique et peut survenir dans tout IDE si les conditions de l'erreur sont vraies.

Méthode non statique ne peut pas être référencée à partir d'un contexte statique

Ceci est une erreur très courante pour les débutants lorsque le programmeur essaie d'utiliser une classe de manière «statique» sans créer d'instance de la classe. Plusieurs conditions doivent être remplies lorsque vous utilisez une classe statique. Dans cet article, nous allons passer en revue plusieurs cas différents et vous expliquer comment utiliser une classe statique.

Qu'est-ce qu'une méthode statique?

L'ajout du mot clé 'statique' à n'importe quelle méthode fait de cette méthode une méthode statique. Une méthode statique appartient à la classe plutôt que d'appartenir à un objet (ce qui est la norme). Une méthode statique peut être facilement invoquée sans la condition de créer une instance d'une classe.

Il existe plusieurs utilisations différentes des méthodes statiques. Par exemple, si vous utilisez cette méthode, vous pouvez modifier un membre de données statique et sa valeur. Cependant, il existe encore certaines limitations lors de l'utilisation d'une méthode statique. Par exemple, si vous souhaitez accéder à des champs non statiques de votre classe, vous devez utiliser une méthode non statique. Donc, pour résumer, les méthodes statiques sont très peu utilisées mais elles ont leurs avantages.

Voici un court exemple de la façon dont une méthode statique peut être créée pour changer la propriété de tous les objets.

 classe Students {int roll_no; Nom de chaîne; static String college = "InformationTech"; statique void change () {college = "Management";} Etudiants (num entier, String nom_aute) {roll_no = numéro; nom = nom_autre;} void display () {System.out.println (rollno + "" + nom + "" + college);} public static void main (String args []) {Students.change (); Students stu_1 = nouveaux étudiants (100, "Mexican"); Students stu_2 = nouveaux étudiants (202, "American"); Students stu_3 = nouveaux étudiants (309, "Britanniques"); stu_1.display (); stu_2.display (); stu_3.display ();}} 

Le résultat du programme sera:

 100 Management mexicain 202 Management américain 309 Management britannique 

Quelle est la différence entre une classe et une instance d'une classe?

Pensez que vous marchez dans la rue et que vous voyez une voiture. Maintenant, vous savez immédiatement qu'il s'agit d'une voiture, même si vous ne savez pas quel est son modèle ou son type. C'est parce que vous savez que cela appartient à la classe des «voitures» que vous connaissez déjà. Pensez à la classe ici comme un modèle ou une idée.

Maintenant que vous vous approchez, vous voyez le modèle et la marque de la voiture. Ici, vous reconnaissez "l'instance" de la classe "voiture". Ici toutes les propriétés seront présentes en détail; les roues, la puissance, les jantes, etc.

Un exemple de propriétés peut être que la classe 'voiture' stipule que toutes les voitures devraient avoir des roues. La voiture que vous voyez (une instance de la classe automobile) a des jantes en alliage.

En programmation orientée objet, vous définissez vous-même la classe et à l'intérieur de celle-ci, vous définissez un champ de type "couleur". Chaque fois que la classe est instanciée, la mémoire est automatiquement réservée à la couleur du backend. Vous pouvez ensuite lui attribuer une valeur spécifique (par exemple le rouge). Comme ces attributs sont spécifiques, ils ne sont pas statiques.

En revanche, les méthodes et les champs statiques sont partagés avec toutes les instances. Celles-ci sont faites pour la valeur ou des éléments qui sont spécifiques à la classe et non l'instance elle-même. Pour les méthodes, il peut y avoir des méthodes globales (par exemple, convertisseur de chaîne) et pour les champs, ce sont généralement des constantes selon votre code (par exemple, le type de voiture peut être statique si vous ne fabriquez que des voitures normales).

Nous allons maintenant examiner tous les cas où votre codage peut mal tourner et voir les solutions pour les résoudre.

Problème 1: vous appelez quelque chose qui n'existe pas

Nous avons rencontré des cas où les utilisateurs utilisaient des méthodes statiques et non statiques les uns avec les autres. Lorsque nous faisons cela, vous devriez faire attention à quelle méthode appelle quoi (en termes de statique ou non). Regardez le code suivant:

 java.util.List privé someMethod () {/ * Certains codes * / return someList; } public static void main (String [] strArgs) {// L'instruction suivante provoque l'erreur. Vous savez pourquoi .. java.util.List someList = someMethod (); } 

Ici, la méthode statique appelle someMethod. Dans la programmation orientée objet, nous encapsulons les données avec les données sur lesquelles nous souhaitons fonctionner. Ici, 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 la classe, il devrait toujours y avoir une instance d'objet pour leur fournir des données.

Donc, pour résumer, vous ne pouvez pas appeler quelque chose qui n'existe pas. Comme vous n'avez peut-être pas créé d'objet, la méthode non statique n'existe pas encore. Cependant, par contre, une méthode statique existera toujours (à cause de la définition).

Problème 2: les méthodes ne sont pas statiques

Si vous appelez des méthodes à partir de votre méthode principale statique sans en créer une instance, vous recevrez un message d'erreur. Ici, le même principe s'applique; vous ne pouvez pas accéder à quelque chose qui n'existe pas.

 Classe publique BookStoreApp2 {// constantes pour les options Entrée de scanner = new Scanner (System.in); public static void main (String [] args) {BookStoreItem [] élément; // déclaration d'un élément de tableau = new BookStoreItem [10]; // initialisation d'un tableau int itemType = -1; printMenu (); getUserChoice (); for (int i = 0; i <item.length; i ++) {} // fin de l'instruction de commutation} // fin de la boucle for pour (int i = 0; i <item.length; i ++) {} // end de pour} // fin de la méthode principale 

Ici, dans ce code, vous devez convertir les méthodes printMenu () et getUserChoice () en méthodes statiques.

Par conséquent, si vous souhaitez contourner une telle situation, vous pouvez utiliser un constructeur . Par exemple, vous pouvez prendre le contenu de votre méthode main () et les placer dans un constructeur.

 public BookStoreApp2 () {// Placez le contenu de la méthode main ici} Après cela, procédez comme suit dans votre méthode main (): public void main (String [] args) {new BookStoreApp2 (); } 

Si ces astuces ne fonctionnent pas sur votre ou votre code est différent, gardez à l'esprit les principes de base des classes et méthodes statiques et revérifiez votre code pour vous assurer que le principe de base n'est pas violé.

Des Articles Intéressants