Java內部類的分類


內部類分類:

  • 成員內部類
  • 匿名內部類
  • 局部內部類

一、成員內部類

是指可以用private protect default public任意一個進行修飾的,類文件名:外部類$內部類.class
a)非靜態內部類
外部類可以使用內部類和我們平時使用其它的類沒什么區別。
1)非靜態內部類必須寄存在。因此如果有一個非靜態內部類對象被創建,那么它的外部類對象一定會被創建,非靜態內部類對象單獨屬於外部類的某個對象。
2)非靜態內部類對象可以單獨訪問外部類成員,但外部類對象不能直接訪問非靜態內部類的成員。
3)非靜態內部類是屬於外部類的某個對象,因此不能有靜態方法,屬性,靜態初始化塊。
4)外部類的靜態方法不能使用非靜態內部類(因為非靜態內部類是屬於對象的,外部類的靜態方法是屬於外部類的,外部類對象還未被創建,因此不能用),包括不能使用非靜態內部類定義變量,創建實例,但非靜態內部類可以使用外部類的屬性及方法。
內部類的成員變量訪問要點
1)內部類方法的局部變量:直接訪問。
2)內部類屬性:this.屬性名
3)內部類訪問外部類屬性:外部類.this.屬性名
例子:

package com.liuzeyu12a.OOT;

public class TestInnerClass {
    public static void main(String[] args) {
        //生成內部類對象
        Outer.inner inner = new Outer().new inner();
        inner.show();

    }
}

class Outer{
    public  int age = 100;
    void testOuter(){
        System.out.println("外部類對象");
    }
    class inner{
        int ageInner = 80;
        public void show(){
            int ageFun = 300;
            System.out.println("外部類成員變量:"+Outer.this.age);
            System.out.println("內部類成員變量:"+this.ageInner);
            System.out.println("內部類成員變量:"+ageFun);
        }

    }
}

b)靜態內部類

static  class   ClassName {
//類體
}

靜態內部類使用要點
1)當一個靜態內部類存在時並不一定存在外部類對象,內部類屬於外部類,不屬於外部類對象,因此,靜態內部類的實例方法不能直接訪問外部類的實例和方法。
2)靜態內部類屬於外部類的一個靜態成員,因此外部類可以通過 “靜態內部類.名字”的方式訪問靜態內部類的靜態成員,通過new靜態內部類訪問靜態內部類的實例。
例子:

package com.liuzeyu12a.OOT;

public class TestInnerClass02 {
    public static void main(String[] args) {
        //創建靜態內部類對象
        Outer2.Inner2 inner2 = new Outer2.Inner2();
        inner2.show();

        //執行外部了的方法
        new Outer2().show();
    }
}

class Outer2{

    String name;
    int age;
    public void show(){
        System.out.println("外部類訪問內部類成員"+new Inner2().age);
    }
    //靜態內部類
    static class Inner2{

        int age = 100;
        public void show(){
            /** * 當一個靜態內部類對象存在,並不一定存在對應的外部類對象。 * 因此,靜態內部類的實例方法不能直接訪問外部類的實例方法。 */
            //System.out.println(Outer2.this.age);
            System.out.println("staic inner2");
        }
    }
}

二、匿名內部類

匿名內部類使用要點
1)匿名內部類沒有訪問修飾符
2)匿名內部類沒有構造方法,因為它連名字都沒有哪來的構造器

package com.liuzeyu12a.OOT;

public class TestAnonymousInner {

    public static void main(String[] args) {
        /** * 這里說明一下為什么System.out.println("測試匿名內部類"); * 沒有被實現,因為這個是new 接口實現類的時候必須實現的方法 * 但是這個方法並沒有被調用,所以並不會被運行 */
        TestAnonymousInner.test(new AA() {
            @Override
            public void aa() {
                System.out.println("測試匿名內部類");
            }
        });
    }

    static void test(AA aa){
        System.out.println("test AA ==>" + AA.aa);
    }
}
//接口AA
interface AA{
    int aa = 100;
    void aa();
}

二、局部內部類

還有一種內部類,它是定義在方法內部的,作用域只限於本方法,稱為局部內部類。

  局部內部類的的使用主要是用來解決比較復雜的問題,想創建一個類來輔助我們的解決方案,到那時又不希望這個類是公共可用的,所以就產生了局部內部類。局部內部類和成員內部類一樣被編譯,只是它的作用域發生了改變,它只能在該方法中被使用,出了該方法就會失效。

  局部內部類在實際開發中應用很少。
public class Test2 {
    public void show() {
        //作用域僅限於該方法
        class Inner {
            public void fun() {
                System.out.println("helloworld");
            }
        }
        new Inner().fun();
    }
    public static void main(String[] args) {
        new Test2().show();		//輸出helloworld
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM