Correzione: non è possibile fare riferimento a un metodo non statico da un contesto statico

Molti programmatori affrontano il messaggio di errore " Impossibile fare riferimento a un metodo non statico da un contesto statico " durante la codifica. Questo messaggio di errore non è specifico e può verificarsi in qualsiasi IDE se le condizioni per l'errore sono vere.

Questo è un errore molto comune per i principianti in cui il programmatore cerca di utilizzare una classe "staticamente" senza creare un'istanza della classe. Esistono diverse condizioni che devono essere soddisfatte quando si utilizza una classe statica. In questo articolo, esamineremo diversi casi e ti guideremo su come utilizzare una classe statica.

Cos'è un metodo statico?

L'aggiunta della parola chiave "statico" a qualsiasi metodo rende il metodo noto come metodo statico. Un metodo statico appartiene alla classe piuttosto che a un oggetto (che è la norma). Un metodo statico può essere facilmente richiamato senza la condizione di creare un'istanza di una classe.

Esistono diversi usi dei metodi statici, ad esempio, utilizzandolo, è possibile modificare un membro di dati statici e il suo valore. Tuttavia, esistono ancora alcune limitazioni quando si utilizza un metodo statico. Ad esempio, se desideri accedere ai campi non statici della tua classe, devi utilizzare un metodo non statico. Quindi, per riassumere, i metodi statici sono usati molto raramente ma hanno i loro vantaggi.

Di seguito è riportato un breve esempio di come è possibile creare un metodo statico per modificare la proprietà di tutti gli oggetti.

classe Studenti {int roll_no; Nome stringa; static String college = "InformationTech"; static void change () {college = "Management";} Studenti (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 = new Students (309, "British"); stu_1.display (); stu_2.display (); stu_3.display ();}}

L'output del programma sarà:

100 Management messicano 202 Management americano 309 Management britannico

Qual è la differenza tra una classe e un'istanza di una classe?

Pensa di camminare per strada e di vedere una macchina. Ora sai subito che questa è un'auto anche se non sai qual è il suo modello o tipo. Questo perché sai che questo appartiene alla classe di "auto" che già conosci. Pensa alla lezione qui come un modello o un'idea.

Ora mentre ti avvicini, vedi il modello e la marca dell'auto. Qui stai riconoscendo l '"istanza" della classe "macchina". Qui tutte le proprietà saranno presenti in dettaglio; le ruote, la potenza, i cerchi ecc.

Un esempio di proprietà può essere che la classe "auto" afferma che tutte le auto devono avere ruote. L'auto che stai vedendo (un esempio della classe dell'auto) ha cerchi in lega.

Nella programmazione orientata agli oggetti, definisci tu stesso la classe e all'interno della classe, definisci un campo di tipo "colore". Ogni volta che viene creata un'istanza della classe, la memoria viene automaticamente riservata al colore nel backend e in seguito è possibile assegnare a questo un valore specifico (ad esempio il rosso). Poiché attributi come questi sono specifici, non sono statici.

Al contrario, metodi e campi statici vengono condivisi con tutte le istanze. Questi sono fatti per valore o elementi che sono specifici per la classe e non per l'istanza stessa. Per i metodi, possono esserci metodi globali (ad esempio, convertitore stringtoInt) e per i campi, di solito sono costanti in base al codice (ad esempio, il tipo di auto può essere statico se si producono solo auto normali).

Ora esamineremo tutti i diversi casi in cui la tua codifica può andare storta e vedremo le soluzioni alternative per risolverli.

Problema 1: stai chiamando qualcosa che non esiste

Ci siamo imbattuti in alcuni casi in cui gli utenti utilizzavano metodi statici e non statici tra loro. Quando lo facciamo, dovresti stare attento a quale metodo sta chiamando cosa (in termini di statico o meno). Dai un'occhiata al codice seguente:

private java.util.List someMethod () {/ * Some Code * / return someList; } public static void main (String [] strArgs) {// La seguente istruzione causa l'errore. Sai perché .. java.util.List someList = someMethod (); }

Qui, il metodo statico chiama someMethod. Nella programmazione orientata agli oggetti, incapsuliamo i dati insieme ai dati su cui vogliamo operare. Qui, senza un oggetto, non ci sono dati di istanza e mentre i metodi di istanza esistono come parte della definizione di classe, dovrebbe sempre esserci un'istanza di oggetto per fornire loro i dati.

Quindi, per riassumere, non puoi chiamare qualcosa che non esiste. Poiché potresti non aver creato un oggetto, il metodo non statico non esiste ancora. Tuttavia, d'altra parte, esisterà sempre un metodo statico (a causa della definizione).

Problema 2: i metodi non sono statici

Se si richiamano metodi dal metodo principale statico senza creare un'istanza dei metodi, verrà visualizzato un messaggio di errore. Qui si applica lo stesso principio; non puoi accedere a qualcosa che non esiste.

public class BookStoreApp2 {// costanti per le opzioni Scanner input = new Scanner (System.in); public static void main (String [] args) {BookStoreItem [] item; // dichiarare array item = new BookStoreItem [10]; // inizializzare array int itemType = -1; printMenu (); getUserChoice (); for (int i = 0; i <item.length; i ++) {} // end of switch statement} // end of for loop for (int i = 0; i <item.length; i ++) {} // end di for} // fine del metodo principale

Qui in questo codice, è necessario convertire entrambi i metodi printMenu () e getUserChoice () in metodi statici.

Quindi, se vuoi aggirare una situazione come questa, puoi usare un costruttore . Ad esempio, puoi prendere i contenuti del tuo metodo main () e inserirli in un costruttore.

public BookStoreApp2 () {// Metti qui il contenuto del metodo main} Dopo averlo fatto, fai quanto segue all'interno del tuo metodo main (): public void main (String [] args) {new BookStoreApp2 (); }

Se questi suggerimenti non funzionano sul tuo codice o se il tuo codice è diverso, dovresti tenere a mente i principi di base delle classi e dei metodi statici e ricontrollare il tuo codice per assicurarti che il principio di base non venga violato.