黑馬程式設計師————JAVA之內部類
------- android培訓、java培訓、期待與您交流! ----------
內部類
內部類分別有:1,非靜態成員內部類2,靜態成員內部類3,區域性內部類4,匿名內部類
(1)成員內部類
A:定義,:在一個外部類中有成員變數和成員方法,那麼成員內部類就是把整個一個類當成了外部類的成員對待了
B: 訪問方式:內部類訪問外部類,內部類可以直接訪問外部類,包括私有成員,因為內部類擁有外部類的引用是類名.this
外部類訪問內部類,外部類訪問外部類的成員,必須要建立內部類的物件
格式:外部類名.內部類名 = 外部類物件.內部類物件;
Outer.Inner oi = new Outer().new Inner();//outer代表外部類,Inner代表內部類
C:存放位置:在外部類裡,在外部類的成員方法外.
D:修飾符:final、abstract、public、private、protected和static等,那麼被static修飾的就是下面所說的
靜態內部類.
(2)靜態內部類
A:定義,就是在成員內部類的基礎上加上static
B:格式:外部類名.內部類名 = 外部類名.內部類物件;
Outer.Inner oi = new Outer.Inner();
C:存放位置:和成員內部類一樣,就是多了個static
(3)區域性內部類
A:定義,在外部類成員方法中定義的內部類,他更像區域性變數
B: 注意:
第一:方法內部類只能在定義該內部類的方法內例項化,不可以在此方法外對其例項化。
第二:方法內部類物件不能使用該內部類所在方法的非final區域性變數。因為方法的區域性變數位於棧上,
只存在於該方法的生命期內。當一個方法結束,其棧結構被刪除,區域性變數成為歷史。
但是該方法結束之後,在方法內建立的內部類物件可能仍然存在於堆中!
例如,如果對它的引用被傳遞到其他某些程式碼,並存儲在一個成員變數內。
正因為不能保證區域性變數的存活期和方法內部類物件的一樣長,所以內部類物件不能使用它們。
第三:方法內部類的修飾符。與成員內部類不同,方法內部類更像一個區域性變數。可以用於修飾方法內部類
的只有final和abstract。
第四:靜態方法內的方法內部類。靜態方法是沒有this引用的,因此在靜態方法內的內部類遭受同樣的待遇,
即:只能訪問外部類的靜態成員。
(4)匿名內部類:沒有名字的內部類。它是內部類的簡化寫法。
A:前提:內部類可以繼承或實現一個外部類或者介面。
B:格式為:new 外部類名或者介面名(){覆蓋類或者介面中的抽象的方法,(也可以自定義內容。)}
C:簡單理解:就是建立一個帶內容的外部類或者介面的子類的匿名物件。
D: a,繼承式的匿名內部類
b,介面式(也可以叫實現式的,名字無所謂)的匿名內部類
c,引數式的匿名內部類
多加一句:我的理解,其實與其說是匿名內部類,我個人認為說是匿名物件更確切一點(個人理解,僅供參考);
interface Inter { public abstract void show1(); public abstract void show2(); } //有名字的內部類 class Outer { public void method(){ class Inner implements Inter { public void show1(){ System.out.println("show1"); } public void show2(){ System.out.println("show1"); } } } public void show() { Inter in = new Inner();//父類引用指向子類物件 in.show1(); in.show2(); } } //匿名內部類(重點,android裡面用的多,awt的監聽器用的多) class Outer { public void method() { //匿名內部類物件呼叫方法 new Inter() { public void show1() { System.out.println("show1"); } public void show2() { System.out.println("show1"); } }.show1(); new Inter() { public void show1() { System.out.println("show1"); } public void show2(){ System.out.println("show1"); } }.show2(); //匿名內部類物件的另一種呼叫方式,父類引用指向子類物件 Inter in = new Inter() { public void show1() { System.out.println("show1"); } public void show2() { System.out.println("show1"); } }; in.show1(); in.show2(); } }
(5)什麼時候使用匿名內部類呢?
A:通常在使用方法是介面型別引數,並該介面中的方法不超過三個時,
可以將匿名內部類作為引數傳遞。