Java中的內部類

一 : 內部類的定義

         內部類( InnerClass )就是定義在另外一個類裏面的類。與之對應,包含內部類的類被稱爲外部類。


         內部類的主要作用如下:

        1.內部類提供了更好的封裝,可以把內部類隱藏在外部類之內,不允許同一個包中的其他類訪問該類

        2. 內部類的方法可以直接訪問外部類的所有數據,包括私有的數據

        3. 內部類所實現的功能使用外部類同樣可以實現,只是有時使用內部類更方便


        內部類可分爲以下幾種:

        1.成員內部類

        2.靜態內部類

        3.方法內部類

        4.匿名內部類

       下面是一個內部類的舉例:

        

//外部類HelloWorld

public class HelloWorld {

 

 // 內部類Inner,類Inner在類HelloWorld的內部

 public class Inner {

     

        // 內部類的方法

        public void show() {

            System.out.println("welcome to imooc!");

        }

    }

 

    public static void main(String[] args) {

     

     // 創建外部類對象

        HelloWorld hello= new HelloWorld();

     // 創建內部類對象

        Inner i = hello.new  Inner();

     // 調用內部類對象的方法

        i.show();

    }

}

運行結果如下:

welcome to imooc!

二:Java中的成員內部類

      內部類中最常見的就是成員內部類,也稱爲普通內部類。我們來看如下代碼:

      

public classOuter {

       private int a=9;//外部類的私有屬性

       //定義一個內部類

      public class Inner{

        int b=2;//內部類的成員屬性

        public void test(){

            System.out.println("訪問外部類中的a:"+a);

            System.out.println("訪問內部類中的b:"+b);

        }

     }

     public static void main(String[] args) {

        // 創建外部類對象o

        Outer o=new Outer();

        //使用外部類對象創建內部類對象i

        Inner i=o.newInner();

        //調用內部類方法

        i.test();

    }

 }

運行結果如下:

訪問外部類中的a:9
訪問內部類中的b:2

從上面的代碼中我們可以看到,成員內部類的使用方法

1 Inner 類定義在 Outer 類的內部,相當於 Outer 類的一個成員變量的位置,Inner 類可以使用任意訪問控制符,如       public protected private

2 Inner 類中定義的 test() 方法可以直接訪問 Outer 類中的數據,而不受訪問控制符的影響,如直接訪問 Outer 類中的私有屬性a

3 定義了成員內部類後,必須使用外部類對象來創建內部類對象,而不能直接去 new 一個內部類對象,即:內部類對象名 = 外部類對象.new 內部類( );

注意一下幾點:

1.外部類是不能直接使用內部類的成員和方法滴


      

     可先創建內部類的對象,然後通過內部類的對象來訪問其成員變量和方法。

 2.  如果外部類和內部類具有相同的成員變量或方法,內部類默認訪問自己的成員變量或方法,如果要訪問外部類的         成員變量,可以使用 this 關鍵字。如

 

三:Java中的靜態內部類

      靜態內部類是 static 修飾的內部類,這種內部類的特點是:

      1靜態內部類不能直接訪問外部類的非靜態成員,但可以通過 new 外部類().成員 的方式訪問

      2 如果外部類的靜態成員與內部類的成員名稱相同,可通過類名.靜態成員訪問外部類的靜態成員;如果外部                類的靜態成員與內部類的成員名稱不相同,則可通過成員名直接調用外部類的靜態成員

       

       3 創建靜態內部類的對象時,不需要外部類的對象,可以直接創建 內部類對象名= new 內部類();


運行結果如下:

訪問外部類中的b:1

訪問內部類中的b:2

四:Java中的方法內部類

 方法內部類就是內部類定義在外部類的方法中,方法內部類只在該方法的內部可見,即只在該方法內可以使用,如下  代碼:

 

//外部類

public classHelloWorld {

   

   privateString name= "愛慕課";

   

   // 外部類中的show方法

   publicvoidshow() {

        // 定義方法內部類

        class MInner {

            int score = 83;

            public int getScore() {

                return score + 10;

            }

        }

       

        // 創建方法內部類的對象

        MInner mi=new MInner();

       

        // 調用內部類的方法

        int newScore=mi.getScore();

       

        System.out.println("姓名:" + name + "\n加分後的成績:" + newScore);

    }

   

    // 測試方法內部類

    public static void main(String[] args) {

       

        // 創建外部類的對象

        HelloWorld hello=new HelloWorld();

       

        // 調用外部類的方法

        hello.show();

    }

}

運行結果如下:

姓名:愛慕課

加分後的成績:93

一定要注意哦:由於方法內部類不能在外部類的方法以外的地方使用,因此方法內部類不能使用訪問控制符和 static 修飾符。

五:Java中的匿名內部類

 

顧名思義,沒有名字的內部類。表面上看起來它們似乎有名字,實際那不是它們的名字。
當程序中使用匿名內部類時,在定義匿名內部類的地方往往直接創建該類的一個對象。匿名內部類的聲明格式如下:
new ParentName(){
...// 內部類的定義
}
匿名內部類就是沒有名字的內部類。什麼情況下需要使用匿名內部類?如果滿足下面的一些條件,使用匿名內部        類是比較合適的:
·只用到類的一個實例 。
·類在定義後馬上用到。
·類非常小(SUN推薦是在4行代碼以下)
·給類命名並不會導致你的代碼更容易被理解。
在使用匿名內部類時,要記住以下幾個原則:
·匿名內部類不能有構造方法
·匿名內部類不能定義任何靜態成員、靜態方法。
·匿名內部類不能是public,protected,private,static。
·只能創建匿名內部類的一個實例。
·一個匿名內部類一定是在new的後面,用其隱含實現一個接口或實現一個類。
·因匿名內部類爲局部內部類,所以局部內部類的所有限制都對其生效。

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