今天刷題的時候遇到了一題關於內部類的訪問的問題,發現自己忘了許多,現在來複習一下。
首先,內部類的類位元組碼檔案名字為outer$inner.class。
記住一下訪問原則:
1.內部類相當於外部類的乙個成員變數,因此內部類可以直接訪問外部類的成員。但是注意內部類靜態方法不能訪問外部類非靜態成員
2.但是外部類如果要訪問內部類中的成員,要麼內部類是靜態的,跟著外部類一起被載入;要麼建立內部類的物件,通過物件訪問(想讓外部類進內部類裡面,總得有內部類的「實體」吧,這個「實體」要麼是跟外部類一起載入的靜態內部類,要麼是新建的內部類的物件,無論是哪種,都會在堆中為內部類開闢空間,然後才可以訪問到)
例子:
a.外部類訪問靜態內部類的靜態成員(一路暢通無阻)
outer.inner.func();
b.外部類訪問靜態內部類的非靜態成員(一路暢通到內部類門口,
發現裡面還沒東西,怎麼辦?建立物件!)
//一般方式
outer.inner in = new outer.inner();
in.func();
//匿名方式
new outer.inner().func();//new outer.inner()建立出物件,然後呼叫物件的func
c.外部類訪問非靜態內部類的非靜態成員(沒物件,內部類的門都找不到!乖乖一步步建立物件吧)
//一般方式
outer.inner in = new outer().new inner();
in.func();
//匿名方式
new outer().new inner().func();
3.內部類如果有靜態成員,則內部類也必須是靜態的(否則內部類成員要隨著外部類載入,發現內部類自己都還沒載入,那這個成員是哪兒跑出來的呢?)
4.內部類訪問區域性變數時,區域性變數必須加final修飾符。(隨著方法執行完畢,區域性變數會被釋放,如果此時乙個內部類還引用該變數則會報錯。說到底就是變數的生命週期比內部類例項要短。而final保證這個變數始終指向乙個物件,內部類就可以放心大膽地引用了。其實犯了和c++一樣的毛病:返回了區域性變數的引用)
注意:在jdk8版本之中,方法內部類中呼叫方法中的區域性變數,可以不需要修飾為 final,匿名內部類也是一樣的,主要是jdk8之後增加了 effectively final 功能
class outer
object method()
}object in = new inner();
return in;//返回了內部類物件,但是該物件依然引用著區域性變數
}
內部類訪問特點
內部類的class位元組碼檔案名字格式為outer inner.class。內部類訪問特點 1,內部類可以直接訪問外部類中的成員。2,外部類要訪問內部類,必須建立內部類的物件。一般用於類的設計。分析事物時,發現該事物描述中還有事物,而且這個事物還在訪問被描述事物的內容。這時就是還有的事物定義成內部類...
內部類概述和訪問特點
1 2 1.內部類可以直接訪問外部類的成員,包括私有 3 2.外部類要訪問內部類的成員必須建立物件4 author jjz5 6 7class outer1 13 1415 public void show1 2021 22 23public class outer 28 1 2 成員內部類3 4c...
內部類 內部類的訪問 匿名內部類
內部類 將乙個類定義在另乙個類的裡面,對立面那個類就成為內部類 內建類,巢狀類 定義 當描述事物時,事物的內部還有事物,該事物用內部類來描述。因為內部事務在使用外部事物的內容。舉例子心臟 內部類的訪問規則 1內部類可以直接訪問外部類中的成員,包括私有。之所以可以直接訪問外部類的成員 因為內部類中持有...