"нестатическая переменная, на которую нельзя ссылаться из статического контекста"? - PullRequest
5 голосов
/ 03 октября 2011

Я новичок в Java и пытаюсь развернуть след Фибоначчи с помощью рекурсивной функции, а затем вычислить время выполнения. вот код, который мне удалось написать:

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

Проблема в том, что когда я пытаюсь превратить его в байт-код, я получаю следующую ошибку:

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

Мне интересно, в чем проблема?!

Ответы [ 7 ]

12 голосов
/ 03 октября 2011

Изменение

n = this.fib(n);

до

n = fib(n);

и сделать метод fib статическим.

Либо изменить

n = this.fib(n);

до

n = new nanoTime().fib(n);
3 голосов
/ 03 октября 2011

Нет причин использовать this в вашем коде.

Необходимые шаги:

  1. Переименуйте свой класс во все, что начинается с заглавной буквы
  2. Удалить все this из вашего кода
  3. Добавьте ключевое слово static перед int fib(int n){
  4. Наконец-то получите хорошую книгу по Java! ;)
3 голосов
/ 03 октября 2011

Проблема только в том, что говорится в сообщении.Ваш main метод - static, что означает, что он не связан с экземпляром класса nanoTime, поэтому this ничего не значит.Вам также нужно сделать fib метод static, а затем использовать nanoTime.fib(n).

3 голосов
/ 03 октября 2011

Вам нужно создать экземпляр nanoTime для вызова метода экземпляра или также сделать метод fib статическим.

2 голосов
/ 03 октября 2011
# 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);
    }
}

1 голос
/ 03 октября 2011

Изменить this.fib(n) на:

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

this связано с экземпляром класса.Статический метод запускается не с экземпляром класса, а с самим классом.Поэтому либо измените метод fib на static, либо замените строку, в которой вы вызываете fib, на две вышеуказанные строки.

1 голос
/ 03 октября 2011

Будь осторожен! В Java главное должно быть в определении класса, но это всего лишь точка входа в программу, а не метод объекта / класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...