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 « La méthode non statique ne peut pas être référencée à partir d'un contexte statique » lorsqu'ils codent. Ce message d'erreur n'est pas spécifique et peut se produire dans n'importe quel IDE si les conditions de l'erreur sont vraies.

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

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

L'ajout du mot-clé «statique» à n'importe quelle méthode rend la méthode connue sous le nom de méthode statique. Une méthode statique appartient à la classe plutôt qu'à un objet (ce qui est la norme). Une méthode statique peut être facilement appelée sans la condition de créer une instance d'une classe.

Il existe plusieurs utilisations différentes des méthodes statiques, par exemple, en l'utilisant, vous pouvez modifier un membre de données statiques 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 aux champs non statiques de votre classe, vous devez utiliser une méthode non statique. Donc, pour résumer, les méthodes statiques sont utilisées très rarement mais elles ont leurs avantages.

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

classe Etudiants {int roll_no; Nom de la chaîne; static String college = "InformationTech"; static void change () {college = "Management";} Students (int number, String name_self) {roll_no = number; name = name_self;} void display () {System.out.println (rollno + "" + name + "" + college);} public static void main (String args []) {Students.change (); Students stu_1 = new Students (100, "Mexican"); Students stu_2 = new Students (202, "American"); Students stu_3 = nouveaux étudiants (309, "britanniques"); stu_1.display (); stu_2.display (); stu_3.display ();}}

La sortie 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 rapprochez, 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ésentées en détail; les roues, la puissance, les jantes etc.

Un exemple de propriétés peut être que la classe «voiture» indique que toutes les voitures doivent avoir des roues. La voiture que vous voyez (un exemple de la catégorie de voiture) a des jantes en alliage.

Dans la programmation orientée objet, vous définissez la classe vous-même et à l'intérieur de la classe, vous définissez un champ de type «couleur». Chaque fois que la classe est instanciée, la mémoire est automatiquement réservée pour la couleur au niveau du backend et plus tard, vous pouvez lui donner une valeur spécifique (par exemple rouge). Puisque de tels 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 les éléments 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, le convertisseur stringtoInt) et pour les champs, ce sont généralement des constantes en fonction de votre code (par exemple, le type de voiture peut être statique si vous ne fabriquez que des voitures normales).

Maintenant, nous allons examiner tous les différents cas où votre codage peut mal tourner et voir les solutions de contournement pour les corriger.

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

Nous avons rencontré des cas où les utilisateurs utilisaient à la fois des méthodes statiques et non statiques entre eux. Lorsque nous faisons cela, vous devez faire attention à la méthode qui appelle quoi (en termes de statique ou non). Jetez un œil au code suivant:

private java.util.List someMethod () {/ * Some Code * / 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 voulons opérer. Ici, sans objet, il n'y a pas de données d'instance et bien que les méthodes d'instance existent dans le cadre de la définition de 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. Puisque vous n'avez peut-être pas créé d'objet, la méthode non statique n'existe pas encore. Cependant, d'un autre côté, une méthode statique existera toujours (à cause de la définition).

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

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

public class BookStoreApp2 {// constantes pour les options Scanner input = new Scanner (System.in); public static void main (String [] args) {BookStoreItem [] item; // déclaration du tableau item = new BookStoreItem [10]; // initialisation du tableau int itemType = -1; printMenu (); getUserChoice (); for (int i = 0; i <item.length; i ++) {} // fin de l'instruction switch} // fin de la boucle for for (int i = 0; i <item.length; i ++) {} // end of for} // 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 voulez contourner une situation comme celle-ci, vous pouvez utiliser un constructeur à la place. Par exemple, vous pouvez prendre le contenu de votre méthode main () et le placer dans un constructeur.

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

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