“非静态变量,这不能从静态上下文引用”?

时间:2011-10-03 16:57:28

标签: java recursion static syntax-error

我是一名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 个答案:

答案 0 :(得分:12)

更改

n = this.fib(n);

n = fib(n);

并使方法fib成为静态。

或者,改变

n = this.fib(n);

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

答案 1 :(得分:3)

您需要实例化nanoTime来调用实例方法,或者使fib方法也是静态的。

答案 2 :(得分:3)

问题就在于消息所说的内容。您的main方法为static,这意味着它未链接到nanoTime类的实例,因此this并不意味着什么。您还需要制作fib方法static,然后使用nanoTime.fib(n)

答案 3 :(得分:3)

没有理由在代码中使用this

采取的步骤:

  1. 将您的班级重命名为以大写字母开头的任何内容
  2. 从代码中删除所有this
  3. static
  4. 之前添加int fib(int n){关键字
  5. 最后得到一本好的Java书! ;)

答案 4 :(得分: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);
    }
}

答案 5 :(得分:1)

小心!在Java中,main必须在类定义中,但它只是程序的入口点,绝对不是对象/类的方法。

答案 6 :(得分:1)

this.fib(n)更改为:

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

this与类的实例相关联。静态方法不与类实例一起运行,而是与类本身一起运行。因此,要么将fib方法更改为static,要么将您调用fib的行替换为上述两行。