1. 程式人生 > >java類方法中使用內部類的引數問題

java類方法中使用內部類的引數問題

1.問題:

public class Test{
	private int a = 1;
	static int b = 2;
	public void method(){
		final int c = 3;
		int d = 4;
		class Cinner {	
			public void mymethod(){
				//Here		a、b、c、d哪些引數可以呼叫
			}
		}
	}
}
一般理解:Cinner類可以呼叫adcd四個引數,當是受到java技術的限制

答案為:abc  

內部類引數必須為final型別

2.原因:

區域性變數的生命週期與區域性內部類的物件的生命週期的不一致性!

設方法method()被呼叫後,在棧中生成了變數d,此時產生了一個區域性內部類Cinner,它訪問了區域性變數d,當方法methos()結束時,區域性變數d就會死亡,但區域性內部類物件Cinner還可能一直的存在(當沒有人再引用該物件時,它才會死亡),它不會隨著方法method()執行結束死亡,這時就出現了一個錯誤結果,區域性內部類物件Cinner要訪問一個已經不存在的區域性變數d

3.java中解決方法:

當變數是final時,通過final區域性變數“複製”一份,複製品直接作為區域性內部中的資料成員,當局部內部類訪問區域性變數時,其實真正訪問的是這個區域性變數的“複製品”,因此就算當執行棧中的真正的區域性變數死亡時,區域性內部類物件仍可以訪問區域性變數(真正訪問為“複製品”),給人感覺好像區域性變數的生命期延長了。

4.總結:

這個規定是一種無可奈何,同時也說明程式語言的設計時受到實現技術的限制的,這就是一個例子,大家更多關心的是如何設計和思考,對於技術上的實現覺得無關緊要,只要設計好,都能實現。