JAVA的內部類學習總結

來源:互聯網
上載者:User

標籤:

這幾天看書,開始在前面看到了JAVA的內部類,開始以為往後看,可以看懂,結果看到了時間監聽那裡也沒有看懂。

再說自己寫JAVA代碼有個毛病,可能是寫C++和C語言寫多了,就是喜歡把每一個類都單獨的寫在一個檔案裡面。

根本就不存在嵌套或者是一個檔案寫有幾個類的問題。

接下倆給大家總結內部類的含義,以及使用。

這裡還分享幾個不錯的部落格:


http://www.cnblogs.com/nerxious/archive/2013/01/24/2875649.html

http://android.blog.51cto.com/268543/384844/

內部類的共性


(1)、內部類仍然是一個獨立的類,在編譯之後內部類會被編譯成獨立的.class檔案,但是前面冠以外部類的類名和$符號 。 (2)、內部類不能用普通的方式訪問。內部類是外部類的一個成員,因此內部類可以自由地訪問外部類的成員變數,無論是否是private的 。 (3)、內部類聲明成靜態,就不能隨便的訪問外部類的成員變數了,此時內部類只能訪問外部類的靜態成員變數 。



//======================================================================================//

說到這裡有一個問題,問什麼要引入內部類?


典型的情況是,內部類繼承自某個類或實現某個介面,內部類的代碼操作建立其的外圍類的對象。所以你可以認為內部類提供了某種進入 其外圍類的視窗。使用內部類最迷人的原因是: 每個內部類都能獨立地繼承自一個(介面的)實現,所以無論外圍類是否已經繼承了某個(介面的)實現,對於內部類都沒有影響。如果 沒有內部類提供的可以繼承多個具體的或抽象的類的能力,一些設計與編程問題就很難解決。從這個角度看,內部類使得多重繼承的解決 方案變得完整。介面解決了部分問題,而內部類有效地實現了“多重繼承”。


//======================================================================================//


內部類分為以下幾種:

1、成員內部類;

2、方法內部類;

3、匿名內部類;

4、靜態嵌套類;

1、成員內部類 例子
class Outer {class Inner{}}編譯上述代碼會產生兩個檔案:Outer.class和Outer$Inner.class。
2、方法內部類 把類放在方法裡 class Outer { public void doSomething(){ class Inner{ public void seeOuter(){ } } } } (1)、方法內部類只能在定義該內部類的方法內執行個體化,不可以在此方法外對其執行個體化。 (2)、方法內部類對象不能使用該內部類所在方法的非final局部變數。 因為方法的局部變數位於棧上,只存在於該方法的生命期內。當一個方法結束,其棧結構被刪除,局部變數成為曆史。但是該方法結束之後,在方法內建立的內部類對象可能仍然存在於堆中!例如,如果對它的引用被傳遞到其他某些代碼,並儲存在一個成員變數內。正因為不能保證局部變數的存活期和方法內部類對象的一樣長,所以內部類對象不能使用它們。 下面是完整的例子: class Outer { public void doSomething(){ final int a =10; class Inner{ public void seeOuter(){ System.out.println(a); } } Inner in = new Inner(); in.seeOuter(); } public static void main(String[] args) { Outer out = new Outer(); out.doSomething(); } }

3、匿名內部類 顧名思義,沒有名字的內部類。表面上看起來它們似乎有名字,實際那不是它們的名字。 當程式中使用匿名內部類時,在定義匿名內部類的地方往往直接建立該類的一個對象。匿名內部類的聲明格式如下: new ParentName(){ ...// 內部類的定義 }[1]  匿名內部類就是沒有名字的內部類。什麼情況下需要使用匿名內部類?如果滿足下面的一些條件,使用匿名內部類是比較合適的: ·只用到類的一個執行個體 。 ·類在定義後馬上用到。 ·類非常小(SUN推薦是在4行代碼以下) ·給類命名並不會導致你的代碼更容易被理解。 在使用匿名內部類時,要記住以下幾個原則: ·匿名內部類不能有構造方法。 ·匿名內部類不能定義任何靜態成員、靜態方法。 ·匿名內部類不能是public,protected,private,static。 ·只能建立匿名內部類的一個執行個體。 ·一個匿名內部類一定是在new的後面,用其隱含實現一個介面或實現一個類。 ·因匿名內部類為局部內部類,所以局部內部類的所有限制都對其生效。 A、繼承式的匿名內部類 public class Car { public void drive(){ System.out.println("Driving a car!"); } public static void main(String[] args) { Car car = new Car(){ public void drive() { System.out.println("Driving another car!"); } }; car.drive(); } } 結果輸出了:Driving another car! Car引用變數不是引用Car對象,而是Car匿名子類的對象。 B、介面式的匿名內部類。 interface Vehicle { public void drive(); } class Test{ public static void main(String[] args) { Vehicle v = new Vehicle(){ public void drive(){ System.out.println("Driving a car!"); } }; v.drive(); } } 上面的代碼很怪,好像是在執行個體化一個介面。事實並非如此,介面式的匿名內部類是實現了一個介面的匿名類。而且只能實現一個介面。 C、參數式的匿名內部類。 class Bar{ void doStuff(Foo f){ f.foo(); } } interface Foo{ void foo(); } class Test{ static void go(){ Bar b = new Bar(); b.doStuff(new Foo(){ public void foo(){ System.out.println("foofy"); } }); } } 4、靜態嵌套類 靜態內部類中可以定義靜態或者非靜態成員。 從技術上講,靜態嵌套類不屬於內部類。因為內部類與外部類共用一種特殊關係,更確切地說是對執行個體的共用關係。而靜態嵌套類則沒有上述關係。它只是位置在另一個類的內部,因此也被稱為頂級嵌套類。 靜態含義是該內部類可以像其他靜態成員一樣,沒有外部類對象時,也能夠訪問它。靜態嵌套類僅能訪問外部類的靜態成員和方法。 class Outer{ static class Inner{} } class Test { public static void main(String[] args){ Outer.Inner n = new Outer.Inner(); } } 在靜態方法中定義的內部類也是StaticNested Class,這時候不能在類前面加static關鍵字,靜態方法中的StaticNested Class與普通方法中的內部類的應用方式很相似,它除了可以直接存取外部類中的static的成員變數,還可以訪問靜態方法中的局部變數,但是,該局部變數前必須加final修飾符。

JAVA的內部類學習總結

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.