2011-10-03 15 views
5

Soy un principiante de Java y estoy tratando de implementar un camino de Fibonacci a través de la función recursiva y luego calcular el tiempo de ejecución. Este es el código que he conseguido escribir:"variable no estática, esto no se puede hacer referencia desde un contexto estático"?

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); 
    } 
} 

El problema es cuando estoy tratando de convertirlo en código byte-me sale el siguiente error:

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

Me pregunto ¡¿Cuál es el problema?!

+0

Debe usar CamelCase para nombres de clase ... llámalo 'NanoTime' la próxima vez. – mellamokb

+0

+1 @JB Nizet: muy a menudo buscando su excepción en Google y el mensaje que recibe le da un buen resultado y una solución a su problema. Esto es cierto para las preguntas de los principiantes (como esta) o para los problemas más oscuros – Guillaume

+0

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

Respuesta

12

Cambio

n = this.fib(n); 

a

n = fib(n); 

y hacer que el método fib estática.

Como alternativa, cambie

n = this.fib(n); 

a

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

Necesita crear una instancia de nanoTime para llamar a un método de instancia, o hacer que el método fib también sea estático.

+1

¡lamentablemente no tengo ni idea de lo que estás hablando! –

+3

@James: comienza a leer. Esto es básico 101 cosas. – mellamokb

+0

¡un voto por su sinceridad! lol – Gevorg

3

El problema es justo lo que dice el mensaje. Su método main es static, lo que significa que no está vinculado a una instancia de la clase nanoTime, por lo que this no significa nada. También debe realizar su método fibstatic, y luego usar 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

No hay ninguna razón para utilizar this en el código.

Pasos a seguir:

  1. cambiar el nombre de la clase a cualquier cosa que empieza con una letra mayúscula
  2. Retire todo this a partir del código
  3. agregar la palabra clave static antes int fib(int n){
  4. , finalmente, obtener una buen libro de Java! ;)
1

¡Cuidado! En Java, el principal debe estar en una definición de clase, pero es solo el punto de entrada del programa y absolutamente no un método del objeto/clase.

+0

¿Qué significa eso? 'main' ciertamente es un método estático en la clase y se puede llamar como cualquier otro método. La JVM puede usarlo como punto de entrada, pero sigue siendo solo un método. –

1

Cambio this.fib(n) a:

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

this está asociada a la instancia de la clase. Un método estático no se ejecuta con una instancia de clase sino con la clase misma. Por lo tanto, cambie el método fib al static o reemplace la línea donde llama al fib a las dos líneas anteriores.

Cuestiones relacionadas