Static Nested Class 和 Inner Class ---學習筆記

Nested Class (一般是C++的說法),Inner Class (一般是JAVA的說法)。Java內部類與C++嵌套類最大的不同就在於是否有指向外部的引用上。

  注: 靜態內部類(Inner Class)意味着

1 創建一個static內部類的對象,不需要一個外部類對象

2 不能從一個static內部類的一個對象訪問一個外部類對象

Anonymous Inner Class (匿名內部類) 是否可以extends(繼承)其它類,是否可以implements(實現)interface(接口)?

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則指的是匿名類或內部類本身。 這時如果我們要使用外部類的方法和變量的話,則應該加上外部類的類名。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章