1. 程式人生 > >java學習遇到的問題 無法從靜態上下文中引用非靜態變數、方法。

java學習遇到的問題 無法從靜態上下文中引用非靜態變數、方法。

在寫java的斐波那契數列遞迴時遇到了一個問題。

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型別物件來呼叫,而非靜態的方法需要一個例項物件,有可能還未被建立,所以為了避免在靜態方法中呼叫一個還不存在的例項物件的非靜態方法,編譯期就會直接阻止這個行為。

解決的方法有兩種,

  1. 第一種是將被呼叫的方法設定成靜態方法;
  2. 第二種是new本類,然後通過例項來呼叫。

第一種:

public class Fibonacci
{
	public static void 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 static void main(String []args)
	{
		Fibonacci fibonacci= new Fibonacci();
		int x = fibonacci.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);
		}
	}
}