"Non static variable cannot be referenced from a static..."

di il
4 risposte

"Non static variable cannot be referenced from a static..."

Ciao

Voglio progettare un metodo che da un oggetto "Data" (descritto dai campi g,m,a, ossia giorno mese anno) mi dia come valore di ritorno un intero che rappresenta il giorno successivo. Esempio:

Se l'oggetto Data d1 è così definito:

g=31 m=1 a=1990

il metodo dovrebbe ritornare come valore 1.

Io avevo già pensato a una soluzione, tuttavia errata:

private static int gSucc(Data d) {
	    if ((g<28) || (g==28&& (m!=FB||isBisestile())) || (g==29 && (isM30()||isM31())) |(g==30&&isM31())) 
		    return g+1; 
		else
		    return 1;
(-isM30(): indica se un mese è di 30 giorni
-isM31(): indica se un mese è di 31 giorni
-isBisestile(): indica se l'anno è bisestile)


Quando cerco infatti di compilare mi viene riferito che "non static variable cannot be referenced from a static context". La mia domanda è quindi: perché mi viene questo tipo di errore? Come parametro esplicito io ho un oggetto di tipo Data, quindi definito nei suoi campi di esemplare g,m,a: perché poi nel metodo non possono essere utilizzati?

Grazie

4 Risposte

  • Re: "Non static variable cannot be referenced from a static..."

    Penso di aver risolto autonomamente il problema (quanto meno il compilatore non trova nessun errore):

    avevo dimenticato di dire esplicitamente che i campi di esemplare utilizzati all'interno del metodo si riferissero all'oggetto Data d.

    Ecco la mia correzione:
    
    if ((d.g<28) || (d.g==28&& (d.m!=FB|| d.isBisestile())) || (d.g==29 && (d.isM30()||d.isM31())) || (d.g==30&&d.isM31())) 
    		    return d.g+1; 
    		else
                         return 1;
    }
    
    E' esatto o ci sono altre spiegazioni?
  • Re: "Non static variable cannot be referenced from a static..."

    Ciao a Tutti,
    il mio problema è un'attimino diverso, ma riguarda lo stesso topic.
    Da quando ho ripreso a programmare in Java non riesco a comprendere perché io non riesca a far fare ai miei programmi le cose più elementari.
    Forse ci sarà qualche cosa che non ho capito nella logica di programmazione e vorrei tanto sciogliere questi miei dubbi con il vostro aiuto.

    Posto il codice di una semplice Calcolatrice che dati 2 numeri interi esegue 3 semplicissime operazioni. La particolarità è che per avere un codice più pulito ho definito le 3 classi seguenti: Una Main Class, una Model Class e una Controller Class, ovvero mi piacerebbe rispettare, per quanto possibile il pattern MVC. Il problema è che sia che le dichiarazioni dei due operandi si trovino all'interno o all'esterno (vedi codice commentato) del metodo main, se tutti quanti i metodi e le variabili delle classi esterne non sono definite STATIC, continuo ad avere l'errore che si riporta nel Titolo di questa discussione.
    Dove sto sbagliando?
    Cosa dovrei modificare per farlo funzionare?

    Grazie in anticipo per le risposte

    Fulvio
    package com.fulviotarable;
    
    /**
     *
     * @author Fulvio
     */
    public class Calcolatrice {
    
    //    int operando1 = Operandi.getOp1();
    //    int operando2 = Operandi.getOp2();
    
         /**
         * @param args the command line arguments
         */
        public static void main(String[] args) {
    
            int operando1 = Operandi.getOp1();
            int operando2 = Operandi.getOp2();
            
            System.out.print("Alcune operazioni con i numeri ");
            System.out.print(operando1);
            System.out.print(" e ");
            System.out.print(operando2);       
            
            int somma;
            somma = Operazioni.getAdd(operando1, operando2);
            System.out.println("\nLa somma vale: " + somma);
            
            int differenza;
            differenza = Operazioni.getSub(operando1, operando2);
            System.out.println("La differenza vale: " + differenza);
            
            int moltiplicazione;
            moltiplicazione = Operazioni.getMul(operando1, operando2);
            System.out.println("La moltiplicazione vale: " + moltiplicazione);
        }    
    }
    package com.fulviotarable;
    
    /**
     *
     * @author Fulvio
     */
    public class Operandi {
        private int Op1 = -8;
        private int Op2 = 5;
        
        public int getOp1(){ return Op1;}
        public int getOp2(){ return Op2;}
    }
    package com.fulviotarable;
    
    /**
     *
     * @author Fulvio
     */
    public class Operazioni {
    
        public int getAdd(int operando1, int operando2)
        {
            return operando1 + operando2;
        }
        
        public int getSub(int operando1, int operando2)
        {
            return operando1 - operando2;
        }
        
        public int getMul(int operando1, int operando2)
        {
            return operando1 * operando2;
        }    
    }
  • Re: "Non static variable cannot be referenced from a static..."

    Per quanto riguarda il problema di dover dichiarare tutto static, questo dipende dal fatto che, non avendo creato nessuna istanza della tua classe, in questo caso calcolatrice, devi utilizzare tutto a livello "di classe", non puoi infatti riferirti a operando 1 e operando 2 di una particolare istanza.

    Se tu creassi un oggetto Calcolatrice nel main, chiamiamolo c, allora potresti accedere a c.operatore1, ad esempio assegnandoci un valore (cosa che comunque andrebbe fatta con un metodo, in generale le variabili di istanza mantienile private), senza ottenere un errore in compilazione, perché a quel punto la tua variabile non deve essere dicharata come static.

    Ti consiglierei di fare qualche ricerca su google per la questione static / non static, perché c'è davvero una marea di materiale, ti darei solo qualche mio parere personale, anche se non sono un esperto.

    Penso che all'inizio molti programmatori, soprattutto chi non ha familiarità con la programmazione ad oggetti, tendano ad usare molto metodi e variabili statici.
    Di solito si suggerisce invece di usarli solo in casi molto particolari, in genere l 'uso eccessivo dello static è sintomo di un cattivo design.

    Nel tuo caso la classe Operazioni può tranquillamente avere dei metodi statici, sono dei metodi di utilità che non presuppongono alcuna necessità per la classe di mantenere un proprio stato attraverso variabili, di comportarsi diversamente in base ai valori memorizzati in altri campi, di poter essere ridefiniti in una sottoclasse o quant'altro. Devono solo ricevere un input e restituire un risultato, come i metodi in java.lang.Math, ad esempio, che sono infatti metodi statici, di classe.

    Le variabili statiche sono usate in contesti un po' più rari, spesso riferite a valori costanti (quindi associate a campi final). Una variabile ha infatti più senso che sia relativa ad ogni oggetto di una particolare classe, altrimenti perde un pó di senso, pensa ad una classe Persona con le variabili nome e cognome, ovviamente non avrebbe alcun senso definire tali variabili come statiche, di classe, ogni Persona deve avere tali proprietà slegate dalle altre !
    Se una variabile per una certa classe deve essere fissa per ogni oggetto della suddetta classe, come ad esempio le variabili lunghezza e altezza per una classe che rappresenta un bottone in un'interfaccia grafica (non è un grande esempio, ma ora non mi viene granché in mente), può avere senso definirla come static, ma sono appunto casi più rari.

    La tua classe Operandi può invece usare metodi e variabili di istanza, devi però creare un oggetto Operandi per poterla usare nel modo corretto, non ha senso scrivere Operandi.getXxx.
  • Re: "Non static variable cannot be referenced from a static..."

    Grazie @Ansharja,
    ora mi è tutto un po' più chiaro farò tesoro dei tuoi consigli.

    Ciao e Grazie
    Fulvio
Devi accedere o registrarti per scrivere nel forum
4 risposte