1. 程式人生 > >黑馬程式設計師————JAVA之內部類

黑馬程式設計師————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:通常在使用方法是介面型別引數,並該介面中的方法不超過三個時,
  可以將匿名內部類作為引數傳遞。