1. 程式人生 > >Static Nested Class 和 Inner Class的不同

Static Nested Class 和 Inner Class的不同

Nested Class (一般是C++的說法),Inner Class (一般是JAVA的說法)。Java內部類與C++巢狀類最大的不同就在於是否有指向外部的引用上。 注: 靜態內部類(Inner Class)意味著 1 建立一個static內部類的物件,不需要一個外部類物件 2 不能從一個static內部類的一個物件訪問一個外部類物件 Inner Class(內部類)定義在類中的類。 Nested Class(巢狀類)是靜態(static)內部類。1. 要建立巢狀類的物件,並不需要其外圍類的物件。 2. 不能從巢狀類的物件中訪問非靜態的外圍類物件。

Anonymous Inner Class (匿名內部類)匿名的內部類是沒有名字的內部類。

匿名的內部類不能extends(繼承)其它類,但一個內部類可以作為一個介面,由另一個內部類實現。

巢狀類可以作為介面的內部類。正常情況下,你不能在介面內部放置任何程式碼,但巢狀類可以作為介面的一部分,因為它是static 的。只是將巢狀類置於介面的名稱空間內,這並不違反介面的規則。

內部類被繼承,由於內部類有一個指向外圍類物件的祕密引用,所以在繼承內部類的時候,該祕密引用必須被初始化。解決方法是enclosingClassReference.super();語法,看一下程式碼: class Outer …{ class Inner …{ } } class AnoClass extends Outer.Inner …{ AnoClass (Outer wi) …{ wi.super(); } } 匿名類(Anonymous Class) 當一個內部類的類聲名只是在建立此類物件時用了一次,而且要產生的新類需繼承於一個已有的父類或實現一個介面,才能考慮用匿名類,由於匿名類本身無名,因此它也就不存在構造方法,它需要顯示地呼叫一個無參的父類的構造方法,並且重寫父類的方法。 f.addMouseMotionListener(new MouseMotionAdapter(){ //匿名類開始        public void mouseDragged(MouseEvent e){         String s=“Mouse dragging: x=”+e.getX()+“Y=”+e.getY();         tf.setText(s); }       } ); //匿名類結束

存在它的原因是:   1.一個內部類的物件能夠訪問建立它的物件的實現,包括私有資料。即內部類例項對包含它的哪個類的例項來說,是特權的。   2.對於同一個包中的其他類來說,內部類能夠隱藏起來,換句話說,內部類不管方法的可見性如何,那怕是public,除了包容類,其他類都無法使用它。   3.匿名內部類可以很方便的定義回撥。   4.使用內部類可以非常方便的編寫事件驅動程式。 其實它真正的目的僅僅為了定義回撥--進一步就是事件驅動。

在使用匿名內部類時,要記住以下幾個原則:   •匿名內部類不能有構造方法。   •匿名內部類不能定義任何靜態成員、方法和類。   •匿名內部類不能是public,protected,private,static。   •只能建立匿名內部類的一個例項。 •一個匿名內部類一定是在new的後面,用其隱含實現一個介面或實現一個類。   •因匿名內部類為區域性內部類,所以區域性內部類的所有限制都對其生效。

匿名類和內部類中的中的this : 有時候,我們會用到一些內部類和匿名類。當在匿名類中用this時,這個this則指的是匿名類或內部類本身。 這時如果我們要使用外部類的方法和變數的話,則應該加上外部類的類名。