1. 程式人生 > >Java高階特性之內部類

Java高階特性之內部類

 1.   什麼是內部類(InnerClass)?

        一個類中巢狀著另一個類,這樣的類就叫內部類.

       語法:

class outClass{
    public class innerClass{
    }
}

2.   內部類的作用

     一. 為了更好的封裝, 更好的隱藏細節;

     二. 對面對物件的繼承進行了完善,也就是說: Java裡是沒有多繼承的,然而在現實生活中是可以有多繼承的,Java為了完善這種繼承功能, 可以使用內部類來間接實現多繼承. 每個內部類都可以單獨繼承一個父類或者介面而不受外部類繼承父類和介面的影響.

     三. 內部類可以訪問外部類的所有成員,包括私有的成員.

3.  內部類的分類

 一. 成員內部類

         特點: 1. 成員內部類持有外部類物件的引用(外部類.this).

                 2. 成員內部類物件是依賴於外部類物件的,也就是說建立內部類物件首先要建立外部類物件.

                     格式為: outClass.innerClass inner = new OutClass().new innerClass();

                 3. 成員內部類物件是可以訪問外部類的所有成員的,包括私有成員.但外部類物件不能直接訪問內部類成員,必須選建立內部類的物件,通過物件名.成員來訪問.

                 4. 成員內部類可以訪問外部類的靜態成員,可以把成員內部類當做外部類的一個普通成員方法來看待.

                 5. 成員內部類的位元組碼檔案的名字是"外部類名$內部類名.Class"

                 6. 成員內部類中不能出現靜態的成員.

下面通過一段程式碼來看看:

public class InnerClass {
    public static void main(String[] args) {
        Test.Test1 test1 = new Test().new Test1();
        Test.Test2 test2 = new Test().new Test2();
        test1.show();
        test2.show();
    }
}

class  Parent {
    public void show()
    {
        System.out.println("Parent");
    }
}
interface Info{
    public void show();
}

class Test{

    class Test1 extends Parent{
        @Override
        public void show() {
            super.show();
        }
    }
    class Test2 implements Info{
        @Override
        public void show() {
            System.out.println("介面");
        }
    }

}

該程式定義了一個介面Info和一個父類Parent類, 在Test類中,又定義了兩個類Test1和Test2類分別繼承Parent和介面實現類.

在主類中,可以分別定義這兩個內部類的物件,通過物件,可以直接呼叫各個類中的方法.

二. 靜態內部類

   1. 可以把靜態內部類看做是靜態成員方法,靜態的只能訪問靜態;

2. 靜態內部類它獨立於外部類的物件,它優先於外部類物件的建立.

        建立格式: outClass.innerClass = new outClass.innerClass;

例項程式碼如下:

public class InnerClassDemo1 {
    public static void main(String[] args) {
        Outer.Inner inner = new Outer.Inner();//產生靜態內部類物件
    }
}

class Outer {
    private int number1 = 10;
    private static int number2 = 20;

    public void showInner1() {
        System.out.println(number1);
    }

    public static void showInner2() {
        System.out.println(number2);
    }

    /*靜態內部類*/
    public static class Inner {
        private static int num = 1;
        private int num2 = 20;
        public void show(){
            System.out.println(num);
            showInner2();
        }
    }
}

三. 區域性內部類 ----一般申明在塊語句中的內部類

1. 區域性內部類可以看做是方法中的區域性變數,不能加任何訪問修飾符;

  2. 區域性內部類物件在其他外部類中不能建立物件,只能在其申明的方法中建立物件;

 3. 除了靜態內部類,其他內部類都持有外部類物件的引用.

示例程式碼如下:

public class LocalInnerClassDemo {
    public static void main(String [] args){
        Outer outer = new Outer();
        outer.show();
    }
}

class Outer{
    private int num = 1;
    public void show(){
        int num2 = 20;

        //宣告在方法中的內部類就是區域性內部類
        class Inner{
            private int num = 2;
            public void show(){
                System.out.println(Outer.this.num);
            }
        }
        Inner inner =new Inner();

        inner.show();

    }
}


四. 匿名內部類--- 沒有類名的內部類

語法: new介面(){

實現介面的方法

}

new 抽象類(引數列表){

重寫類中的方法

}

示例程式碼如下:

public class AnonymousInnerClass {
    public static void main(String[] args) {
     /* MyInfo minfo= new MyInfo();
      minfo.show();*/

        //new 的是介面的一個實現類物件,只是這個類沒有名字而已
        new Info() {
            @Override
            public void show() {
                System.out.println("hello");
            }
        }.show();
        //info.show();

        //創建出來一個Parent子類的一個物件
        new Parent(){
            @Override
            public void show() {
                System.out.println("hello,parent");
            }
        };



    }
}

interface Info {
    void show();
}

class XXX implements Info {
    @Override
    public void show() {
        System.out.println("hello");
    }
}