定義在方法中的內部類能否訪問該方法的區域性變數

2022-07-03 13:30:14 字數 1275 閱讀 9297

定義在方法中的內部類當然是可以訪問方法中的區域性變數的,訪問的方法就是在區域性變數上新增final關鍵字

(1)內部類是外部類的乙個成員,就像外部類的成員方法一樣,所以內部類有許可權訪問外部類的所有成員,包括private的。

(2)內部類不能訪問外部類方法中的區域性變數,除非變數是final的(一般發生在方法中定義的內部類)。這是因為區域性變數的生命週期原因。

class outer}}

一般做法是在outer中寫乙個返回inner類物件的方法

public inner getinner()

在其他類中使用內部類:

outer outer = new outer();

outer.inner inner = outer.new inner();

或者 outer.inner inner = outer.getinner();

static內部類的使用:

outer.inner inner = new outer.inner();

(1).所謂「區域性內部類」就是在物件的方法成員內部定義的類。而方法中的類,訪問同乙個方法中的區域性變數,卻必須要加上乙個final。

(2).原因是編譯程式實現上的困難:內部類物件的生命週期會超過區域性變數的生命期。區域性變數的生命期:當該方法被呼叫時,該方法中的區域性變數在棧中被建立,當方法呼叫結束時,退棧,這些區域性變數全部死亡。而內部類物件生命期,與其它類一樣,當建立乙個區域性內部類物件後,只有當沒有其它人再引用它時,它才能死亡。所以完全可能乙個方法已呼叫結束(區域性變數已死亡),但該局部類的物件仍然活著。即:區域性類的物件生命期會超過區域性變數。

(3).區域性內部類的物件訪問同乙個方法中的區域性變數,那麼這就要求只要區域性內部類物件還活著,那麼棧中的那些它要訪問的區域性變數就不能「死亡」(否則:它都死了,還訪問個什麼呢?)。這就是說:區域性變數的生命期至少等於或大於區域性內部類物件的生命期。

(4).解決方法:區域性內部類的物件可以訪問同乙個方法中被定義為final的區域性變數。定義為final後,編譯程式的實現方法:將所有的區域性內部類物件要訪問的final型區域性變數,都拷貝成為該內部類物件中的乙個資料成員。這樣,即使棧中區域性變數(含final)已死亡,但由於它是final,其值永不變,因而區域性內部類物件在變數死亡後,照樣可以訪問final型區域性變數。(這一點我有些懷疑)

(5).歸納總結:區域性內部類物件中包含有要訪問的final型區域性變數的乙個拷貝,成為它的資料成員。因此,正是在這個意義上,final型區域性變數的生命期,超過其方法的一次呼叫。嚴格來說,方法呼叫結束,所有的區域性變數(含final)全死亡了。但:區域性內部類物件中有final型區域性變數的拷貝。

參考:

main方法中訪問內部類

同學發了這麼些 報錯,問怎麼解決。public class test2 class a 編譯了一下,報錯 解決方法是 建立外部類物件,再使用外部類物件來new乙個內部變數 public class test2 class a 對main方法而言,雖然寫在類中,它是游離於任何類之外的,因此某類的非靜態...

JAVA中的內部類 方法內部類

方法內部類就是內部類定義在外部類的方法中,方法內部類只在該方法的內部可見,即只在該方法內可以使用。由於方法內部類不能在外部類的方法以外的地方使用,因此方法內部類不能使用訪問控制符和 static 修飾符。下邊的例子 外部類 public class helloworld 建立方法內部類的物件 min...

在外部類的方法中訪問例項內部類示例

在外部類的方法中訪問例項內部類示例 public class interclass public void showinfo 在程式中interclass類的內部巢狀定義了內部類information。在外部類的userinner方法中定義了乙個內部類的物件,並通過這個物件呼叫了內部類的方法。從程式...