無法在靜態上下文中引用非靜態
阿新 • • 發佈:2018-11-20
轉載自:https://blog.csdn.net/cool_ben/article/details/49334655
如下是經典的Fobonacci遞迴演算法:
public class Fibonacci { public static void main(String []args) { int x = f(6); System.out.println(x); } public int f(int x) { if(x==1||x==2) return 1;else return f(x-1)+f(x-2); } }
編譯後出錯,無法在靜態上下文中引用非靜態。
因為一個類的靜態方法在這個Class檔案被載入之後,就可以由這個Class型別物件來呼叫,
而非靜態的方法需要一個例項物件,有可能還未被建立,所以為了避免在靜態方法中呼叫一個還不存在的例項物件的非靜態方法,編譯期就會直接阻止這個行為。
解決的方法有兩種,第一種是將被呼叫的方法設定成靜態方法;第二種是new當前類,然後通過例項來呼叫。
第一種:
public class Fibonacci { public staticvoid main(String []args) { int x = f(6); System.out.println(x); } public static int f(int x) { if(x==1||x==2) return 1; else return f(x-1)+f(x-2); } }
第二種:
public class Fibonacci { public staticvoid main(String []args) { Fibonacci f = new Fibonacci(); int x = f.f(6); System.out.println(x); } public int f(int x) { if(x==1||x==2) return 1; else return f(x-1)+f(x-2); } }