2011-10-03 11 views
5

Sono un principiante Java e sto provando a distribuire un percorso di Fibonacci attraverso la funzione ricorsiva e quindi calcolare il tempo di esecuzione. ecco il codice sono riuscito a scrivere:"variabile non statica non può essere referenziata da un contesto statico"?

class nanoTime{ 
    int fib(int n){ 
     if(n==0) return 0; 
     if(n==1) return 1; 
     return this.fib(n-1)+this.fib(n-2); 
    } 
    public static void main(String[] args){ 
     double beginTime,endTime,runTime; 
     int n=10; 
     beginTime = System.nanoTime(); 
     n = this.fib(n); 
     endTime = System.nanoTime(); 
     runTime = endTime-beginTime; 
     System.out.println("Run Time:" + runTime); 
    } 
} 

Il problema è quando sto cercando di trasformarlo in byte-code ottengo il seguente errore:

nanoTime.java:11: non-static variable this cannot be referenced from a static context 

mi chiedo qual è il problema?!

+0

Dovresti usare CamelCase per i nomi delle classi ... chiamalo 'NanoTime' la prossima volta. – mellamokb

+0

+1 @JB Nizet - molto spesso googling per la tua eccezione e il messaggio che ricevi ti dà un buon risultato e una soluzione per il tuo problema. Questo è vero per le domande dei principianti (come questo) o per altri problemi oscuri – Guillaume

+0

Simile a http://stackoverflow.com/questions/926822/java-non-static-variable-cannot-be-referenced-from-a-static -context-error –

risposta

12

Change

n = this.fib(n); 

a

n = fib(n); 

e rendere il metodo fib statico.

In alternativa, modificare

n = this.fib(n); 

a

n = new nanoTime().fib(n); 
3

È necessario creare un'istanza di nanoTime per chiamare un metodo di istanza oppure rendere statico anche il metodo fib.

+1

sfortunatamente non ho idea di cosa stai parlando! –

+3

@James: inizia a leggere. Questo è roba base 101. – mellamokb

+0

un voto per la tua sincerità! lol – Gevorg

3

Il problema è proprio quello che dice il messaggio. Il tuo metodo main è static, il che significa che non è collegato a un'istanza della classe nanoTime, quindi this non significa nulla. È necessario creare anche il metodo fib e quindi utilizzare nanoTime.fib(n).

2
# Name the class something else to avoid confusion between System.nanoTime and the name of your class. 

class nanoTime1{ 
    int fib(int n){ 
     if(n==0) return 0; 
     if(n==1) return 1; 
     return this.fib(n-1)+this.fib(n-2); 
    } 

    public static void main(String[] args){ 
     double beginTime,endTime,runTime; 
     int n=10; 
     beginTime = System.nanoTime(); 


     # Instantiate an object of your class before calling any non-static member function 

     nanoTime1 s = new nanoTime1(); 
     n = s.fib(n); 
     endTime = System.nanoTime(); 
     runTime = endTime-beginTime; 
     System.out.println("Run Time:" + runTime); 
    } 
} 

3

Non v'è alcun motivo per utilizzare this nel codice.

Passi da fare:

  1. Rinominare la classe a tutto ciò che inizia con una lettera maiuscola
  2. Rimuovere tutti this dal codice
  3. aggiungere la parola chiave static prima int fib(int n){
  4. finalmente avere un buon libro di Java! ;)
1

Fare attenzione! In Java il principale deve essere in una definizione di classe, ma è solo il punto di ingresso del programma e assolutamente non un metodo dell'oggetto/classe.

+0

Che cosa significa? 'main' è sicuramente un metodo statico sulla classe e può essere chiamato come qualsiasi altro metodo. La JVM può usarlo come un punto di ingresso, ma è ancora solo un metodo. –

1

Cambio this.fib(n) a:

nano obj = new nano(); 
n = obj.fib(n); 

this è associato con l'istanza della classe. Un metodo statico non viene eseguito con un'istanza di classe ma con la classe stessa. Quindi, cambiare il metodo fib in static o sostituire la linea in cui si chiama fib alle due righe precedenti.

Problemi correlati