1. 程式人生 > >java 不能引用另一方法中定義的內部類中非終態變數

java 不能引用另一方法中定義的內部類中非終態變數

package com.study;


public class Test {
	
	  public void test01(){
		   String m = "外部定義的方法";
		   class Test02{
			   public Test02() {
				   System.out.println(m);
			   }
			   
		   }
	  }
	  
	  public static void main(String[] args) {
		
	}
	
	
}

如上程式碼報錯為:Cannot refer to the non-final local variable m defined in an enclosing scope 中文為:

不能引用封閉範圍中定義的非最終區域性變數m

原因如下:

內部類和外部類其實是處於同一個級別,內部類不會因為定義在方法中就會隨著方法的執行完畢而跟隨者被銷燬。問題就來了,如果外部類的方法中的變數不定義final,那麼當外部類方法執行完畢的時候,這個區域性變數肯定也就被GC了,然而內部類的某個方法還沒有執行完,這個時候他所引用的外部變數已經找不到了。如果定義為final,java會將這個變數複製一份作為成員變數內置於內部類中,這樣的話,由於final所修飾的值始終無法改變,所以這個變數所指向的記憶體區域就不會變。

可以將要引用的變數定義為final 或者外部類的成員變數。來防止內部類呼叫改變數時,已經被GC了

package com.study;


public class Test {
	private String m = "外部定義的方法";
	
	  public void test01(){
		 // final String m = "外部定義的方法";
		   class Test02{
			   public Test02() {
				   System.out.println(m);
			   }
			   
		   }
	  }
	  
	  public static void main(String[] args) {
	}
	
	
}

這種錯誤一般的場景為,在A方法中使用 new Test(){} ,Test為介面 ,在Test介面中要實現抽象方法,而抽象方法中需要呼叫內部類之外A方法中的變數。為了不報錯。可以使用上面的場景,將變數定義為final或者外部類的成員變數,同時在外部類的構造方法中賦值。