2011-10-03 142 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上述兩條線的線。

相關問題