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

Molti programmatori affrontano il messaggio di errore " Non è possibile 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 dell'errore sono vere.

Il metodo non statico non può essere referenziato da un contesto statico

Questo è un errore molto comune per i principianti in cui il programmatore tenta 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.

Che 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 anziché appartenere 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, ci sono ancora alcune limitazioni quando si utilizza un metodo statico. Ad esempio, se si desidera accedere ai campi non statici della propria classe, è necessario utilizzare un metodo non statico. Quindi, per riassumere, i metodi statici sono usati con molta parsimonia ma hanno i loro benefici.

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

 studenti della classe {int roll_no; Nome della stringa; static String college = "InformationTech"; cambio di vuoto statico () {college = “Management";} Studenti (numero int, 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 = nuovi studenti (309, "British"); stu_1.display (); stu_2.display (); stu_3.display ();}} 

L'output del programma sarà:

 100 Gestione messicana 202 Gestione americana 309 Gestione britannica 

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

Pensi di camminare per strada e vedi una macchina. Ora sai immediatamente che questa è un'auto anche se non sai qual è il suo modello o tipo. Questo perché sai che appartiene alla classe delle "macchine" di cui già conosci. Pensa alla classe qui come modello o idea.

Mentre ti avvicini, vedi il modello e la marca dell'auto. Qui stai riconoscendo l '"istanza" della classe "auto". 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 dovrebbero avere ruote. L'auto che stai vedendo (un'istanza della classe di auto) ha cerchi in lega.

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

Al contrario, i metodi e i campi statici sono condivisi con tutte le istanze. Sono realizzati per valore o elementi specifici della classe e non dell'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 storto 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 no). Dai un'occhiata al seguente codice:

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

Qui, il metodo statico sta chiamando 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. Dato che 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 stanno invocando 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.

 classe pubblica BookStoreApp2 {// costanti per opzioni Input scanner = new Scanner (System.in); public static void main (String [] args) {BookStoreItem [] item; // dichiarando array item = new BookStoreItem [10]; // inizializzando array int itemType = -1; printMenu (); getUserChoice (); per (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 per} // 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 metterli all'interno di un costruttore.

 public BookStoreApp2 () {// Inserisci qui i contenuti del metodo principale} Dopo aver effettuato l'operazione, esegui le seguenti operazioni all'interno del tuo metodo main (): public void main (String [] args) {new BookStoreApp2 (); } 

Se questi suggerimenti non funzionano sul tuo o il tuo codice è diverso, dovresti tenere presente 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.

Articoli Interessanti