摘要:局部內(nèi)部類訪問局部變量的機制在中,類是封裝的,內(nèi)部類也不例外。我們看到的內(nèi)部類訪問局部變量實際上只是訪問了自己的成員屬性而已,這和類的封裝性是一致的。
這里的局部變量就是在類方法中的變量,能訪問方法中變量的類當然也是局部內(nèi)部類了。
我們都知道,局部變量在所處的函數(shù)執(zhí)行完之后就釋放了,但是內(nèi)部類對象如果還有引用指向的話它是還存在的。例如下面的代碼:
class Outer{ public static void main(String[] args){ Outer out = new Outer(); Object obj = out.method(); } Object method(){ int locvar = 1; class Inner{ void displayLocvar(){ System.out.println("locvar = " + locvar); } } Object in = new Inner(); return in; } }
當out.method()方法執(zhí)行結束后,局部變量 locvar 就消失了,但是在method()方法中 obj in = new Inner() 產(chǎn)生的 in 對象還存在引用obj,這樣對象就訪問了一個不存在的變量,是不允許的。這種矛盾是由局部內(nèi)部類可以訪問局部變量但是局部內(nèi)部類對象和局部變量的生命周期不同而引起的。
局部內(nèi)部類訪問局部變量的機制在java中,類是封裝的,內(nèi)部類也不例外。我們知道,非靜態(tài)內(nèi)部類能夠訪問外部類成員是因為它持有外部類對象的引用 Outer.this, 就像子類對像能夠訪問父類成員是持有父類對象引用super一樣。局部內(nèi)部類也和一般內(nèi)部類一樣,只持有了Outer.this,能夠訪問外部類成員,但是它又是如何訪問到局部變量的呢?
實際上java是將局部變量作為參數(shù)傳給了局部內(nèi)部類的構造函數(shù),而將其作為內(nèi)部類的成員屬性封裝在了類中。我們看到的內(nèi)部類訪問局部變量實際上只是訪問了自己的成員屬性而已,這和類的封裝性是一致的。那么上面的代碼實際上是這樣:Object method(){ int locvar = 1; class Inner{ private int obj; public Inner(int obj){ this.obj = obj; } void displayLocvar(){ System.out.println("locvar = " + locvar); } } Object in = new Inner(locvar); //將locvar作為參數(shù)傳給構造,以初始話成員 return in; }
那么問題又來了,我們寫代碼的目的是在內(nèi)部類中直接控制局部變量和引用,但是java這么整我們就不高興了,我在內(nèi)部類中整半天想著是在操作外部變量,結果你給整個副本給我,我搞半天丫是整我自己的東西啊?要是java不這么整吧,由破壞了封裝性--------你個局部內(nèi)部類牛啊,啥都沒有還能看局部變量呢。這不是java風格,肯定不能這么干。這咋整呢?
想想,類的封裝性咱們一定是要遵守的,不能破壞大局啊。但又要保證兩個東西是一模一樣的,包括對象和普通變量,那就使用final嘛,當傳遞普通變量的之前我把它變成一個常量給你,當傳遞引用對象的時候加上final就聲明了這個引用就只能指著這一個對象了。這樣就保證了內(nèi)外統(tǒng)一。
文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://systransis.cn/yun/65306.html
摘要:關鍵字的字面意思是最終的不可修改的這似乎是一個看見名字就大概能知道怎么用的語法但你是否有深究過在各個場景中的具體使用方法注意事項以及背后涉及的設計思想呢一修飾變量基礎修飾基本數(shù)據(jù)類型變量和引用數(shù)據(jù)類型變量相信大家都具備基本的常識被修飾的變量 final關鍵字的字面意思是最終的, 不可修改的. 這似乎是一個看見名字就大概能知道怎么用的語法, 但你是否有深究過final在各個場景中的具體使用方法...
摘要:關鍵字的字面意思是最終的不可修改的這似乎是一個看見名字就大概能知道怎么用的語法但你是否有深究過在各個場景中的具體使用方法注意事項以及背后涉及的設計思想呢一修飾變量基礎修飾基本數(shù)據(jù)類型變量和引用數(shù)據(jù)類型變量相信大家都具備基本的常識被修飾的變量 final關鍵字的字面意思是最終的, 不可修改的. 這似乎是一個看見名字就大概能知道怎么用的語法, 但你是否有深究過final在各個場景中的具體使用方法...
摘要:關鍵字的字面意思是最終的不可修改的這似乎是一個看見名字就大概能知道怎么用的語法但你是否有深究過在各個場景中的具體使用方法注意事項以及背后涉及的設計思想呢一修飾變量基礎修飾基本數(shù)據(jù)類型變量和引用數(shù)據(jù)類型變量相信大家都具備基本的常識被修飾的變量 final關鍵字的字面意思是最終的, 不可修改的. 這似乎是一個看見名字就大概能知道怎么用的語法, 但你是否有深究過final在各個場景中的具體使用方法...
摘要:可以直接用接口名訪問。其他類也稱為外部類。汽車外部類發(fā)動機內(nèi)部類內(nèi)部類的分類內(nèi)部類分為成員內(nèi)部類與局部內(nèi)部類。我們定義內(nèi)部類時,就是一個正常定義類的過程,同樣包含各種修飾符繼承與實現(xiàn)關系等。并且日常項目的分工也是以包作為邊界。 01final關鍵字概念 * A: 概述 繼承的出現(xiàn)提高了代碼的復用性,并方便開發(fā)。但隨之也有問題,有些類在描述完之后,不想被繼承, ...
內(nèi)部類 內(nèi)部類主要作用 內(nèi)部類提供了更好的封裝,可以吧內(nèi)部類隱藏在外部類之內(nèi),不允許同一個包中的其他類訪問該類。 內(nèi)部類成員可以直接訪問外部類的私有數(shù)據(jù),因為內(nèi)部類被當成其外部類成員,同一個類的成員之間可以互相訪問,但外部類不能訪問內(nèi)部類的實現(xiàn)細節(jié)。 匿名內(nèi)部類適合用于創(chuàng)建那些僅需要使用一次的類。 定義內(nèi)部類與外部類的語法大致相同,內(nèi)部類除需要定義在其他類里面之外,還有兩點區(qū)別: 內(nèi)...
閱讀 694·2021-11-25 09:43
閱讀 2964·2021-11-24 10:20
閱讀 1017·2021-10-27 14:18
閱讀 1088·2021-09-08 09:36
閱讀 3398·2021-07-29 14:49
閱讀 1796·2019-08-30 14:07
閱讀 2947·2019-08-29 16:52
閱讀 3057·2019-08-29 13:12