2011-10-03 79 views
5

我是一个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 

我想知道问题是什么?!

+0

您应该使用CamelCase作为类名......下次将其称为'NanoTime'。 – mellamokb

+0

+1 @JB Nizet - 经常在你的例外情况下搜索,你得到的信息为你的问题提供了很好的结果和解决方案。对于初学者的问题(例如这个问题),这是真实的或者更难理解的问题 – Guillaume

+0

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

回答

12

变化

n = this.fib(n); 

n = fib(n); 

,使方法fib静态的。

或者,改变

n = this.fib(n); 

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

您需要实例化一个nanoTime调用一个实例方法,或使fib方法静态为好。

+1

不幸的是,我不知道你在说什么! –

+3

@詹姆斯:开始阅读。这是基本的101个东西。 – mellamokb

+0

为您诚意一票!大声笑 – Gevorg

3

的问题是有消息说什么。你main方法是static,这意味着它不挂nanoTime类的一个实例,所以this并不意味着什么。您还需要制定您的fib方法static,然后使用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

没有理由在代码中使用this

采取的步骤:

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

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

+0

这是什么意思? 'main'肯定是类中的静态方法,可以像其他任何方法一样调用。 JVM可以用它作为入口点,但它仍然只是一种方法。 –

1

更改this.fib(n)到:

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

this与类的实例相关联。静态方法不会与类实例一起运行,而会与类本身一起运行。所以fib方法要么改变static或更换,你叫fib上述两条线的线。

相关问题