Static Nested Class 和 Inner Class的不同

Nested Class 一般是C++的說法,Inner Class 一般是JAVA的說法。

Nested class分爲靜態Static nested class 的和非靜態的 inner class,

靜態的Static nested class是不可以直接調用它的外部類enclosing class的,但是可以通過外部類的引用來調用,就像你在一個類中寫了main方法一樣。

非靜態類inner class 可以自由的引用外部類的屬性和方法,但是它與一個實例綁定在了以其,不可以定義靜態的屬性、方法 。

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

發佈了17 篇原創文章 · 獲贊 2 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章