1. 程式人生 > >成員內部類.區域性內部類.靜態內部類.匿名內部類的區別

成員內部類.區域性內部類.靜態內部類.匿名內部類的區別

一 對於非靜態內部類,不能有靜態成員,例如變數,方法等。靜態內部類的非靜態成員可以訪問外部類的靜態變數,而不可訪問外部類的非靜態變數。非靜態內部類的非靜態成員可以訪問外部類的非靜態變數。

成員內部類可以隨意使用外部類的成員方法及成員變數,儘管這些類成員被修飾為private.內部類的例項一定要繫結在外部類物件上。

一個內部類可以定義在一個類中,一個方法中甚至一個表示式中。

分類:

內部類分為四種:

靜態內部類(static inner classes)

成員內部類(member inner classes)

區域性內部類(local inner classes)

匿名內部類(anonymous inner classes)

1、靜態內部類(static inner classes)

靜態內部類的特徵:

只能訪問外部類的靜態成員變數與靜態方法。靜態內部類的非靜態成員可以訪問外部類的靜態變數,而不可訪問外部類的非靜態變數。

生成靜態內部類物件的方法:

OuterClass.InnerClass inner = new OuterClass.InnerClass();

相關使用例子:

靜態內部類:

class StaticInner{

    private static int a = 1;

    /**

   * 靜態內部類

   * 生成的類名:StaticInner$InnerClass

   */

    public static class InnerClass{

        //靜態內部類可以宣告靜態的成員變數,其他的內部類不可以

        private static int b = 1;

        public void execute(){

            //靜態內部類只能訪問靜態程式

            System.out.println(a +b);

        }

    }

}1 public static void main(String[] args) {

2     //建立靜態內部類

3     StaticInner.InnerClassinnerClass = newStaticInner.InnerClass();

4     innerClass.execute();

5 }

2、成員內部類(member inner classes)

成員內部類的特徵:

成員內部類可以訪問外部類的靜態與非靜態的方法和成員變數。

儘管這些類成員被修飾為private.內部類的例項一定要繫結在外部類物件上。

對於非靜態內部類,不能有靜態成員,例如變數,方法等。

生成成員內部類物件的方法:

OuterClass.InnerClass inner = new OuterClass().new InnerClass();

在區域性內部類中訪問外部類的成員變數的方法:

OuterClass.this.a;

相關使用例子:

class MemberInner{

    private int a = 1;

    public void execute(){

        //在外部類中建立成員內部類

        InnerClass innerClass =this.new InnerClass();

    }

    /**

 * 成員內部類

 */

    public class InnerClass{

        //內部類可以建立與外部類同名的成員變數

        private int a = 2;

        public void execute(){

            //this引用的是內部類

           System.out.println(this.a);

            //在內部了中使用外部類的成員變數的方法

           System.out.println(MemberInner.this.a);

        }

    }

}

public static void main(String[] args) {
    //建立成員內部類
     MemberInner.InnerClass innerClass = new MemberInner().new InnerClass();
     innerClass.execute();
}

3、區域性內部類(local inner classes)

區域性內部類的特徵:

類似於區域性變數,不能定義為public,protected,private或者static型別。

定義方法中,只能方法中宣告為final型別的變數。

相關使用例子:

class LocalInner{

    public void execute(){

        final int a = 1;

        /**

 * 建立區域性內部類

 */

        class InnerClass{

            public void execute(){

               System.out.println("LocalInner Class");

                //區域性內部類只能訪問final型別的變數

                System.out.println(a);

            }

        }

        //只能在所在方法區域建立

        new InnerClass().execute();

    }

}

public static void main(String[] args) {
     //外部不能直接建立區域性內部類
    LocalInner localInner = new LocalInner();
    localInner.execute();
}

4、匿名內部類(anonymous inner classes)

匿名內部類的特徵:

匿名內部類沒有類名,沒有class關鍵字也沒有extends和implements等關鍵字修飾。

匿名內部類會隱式地繼承一個父類或實現一個介面。