Java中內部類的概念與分類詳解

隻能使用修飾限定符:public 和 默認 來修飾類

內部類概念

在 Java 中,將一個類定義在另一個類的內部,稱為內部類

就是在一個類內部進行其他類結構的嵌套操作

內部類也是封裝的一種體現

舉例:

//外部類
public class OutClass {

    //內部類
    class InnerClass{
        
    }
}

註意:內部類和外部類共享一個 java源文件,但是經過編譯之後,會形成各自單獨的字節碼文件

在這裡插入圖片描述

內部類的分類:

成員內部類

在外部類中,內部類定義位置與外部類成員所處的位置相同,因此稱為成員內部類

成員內部類有:普通內部類和靜態內部類

普通內部類

未被 static 修飾的成員內部類

//外部類
public class OutClass {
    public void method(){

    }
    //普通內部類
    class InnerClass1{

    }
}

如何使用普通內部類??

先看普通類的使用:

package Date20210917;

public class Test1 {
    int a;
    public void method1(){

    }
    //普通內部類
    class InnerClass{
        int b;
        void method2() {

        }
    }
    public static void main(String[] args) {
        Test1 test1 = new Test1();
        test1.method1();
}

普通類:先構造對象—通過對象訪問類內部的成員

那麼,我們可以試著 new 一個 InnerClass 的對象:

在這裡插入圖片描述

我們發現並不可行,因為 InnerClass 也是 外部類的成員,所以我們在使用內部類時,需借助外部類的對象來創建內部類的對象

則正確操作:

public static void main(String[] args) {
    //普通類:先構造對象—通過對象訪問類 內部的成員
    Test1 test1 = new Test1();
    test1.method1();

    //普通內部類
    InnerClass innerClass = test1.new InnerClass();
    innerClass.method2();
}

不同文件下 普通內部類的使用:

package Date20210917;

//外部類
public class OutClass {
    //測試Test1 中的內部類的使用:
    void test(){
        Test1 test1 = new Test1();
        //要實例化 Test1 中內部類的對象
        //InnerClass;   編譯器不能識別,因為該類沒在此文件中
        Test1.InnerClass t = test1.new InnerClass();
    }
    public static void main(String[] args) {

    }
}

當內外部類出現同名變量時,使用就近原則~ 即:優先訪問內部類的

public class Test1 {
    int a;
    int b;
    public void method1(){

    }
    //普通內部類
    class InnerClass{
        int b;
        void method2() {
            a = 10;
            method1();
            b = 66; //給內部類自己的 成員變量 b 賦值
        }
    }
}

內部類中給同名外部類成員變量賦值:

Test1.this.b = 88;

調試驗證:

在這裡插入圖片描述

即:編譯後,對 method2 進行以下修改

修改前:

void method2() {
    a = 10;
    method1();
    b = 66; //給內部類自己的 成員變量 b 賦值
    Test1.this.b = 88;
}

修改後:

void method2(InnerClass this){
	this$0.a = 10;
	method1(this$0);
	this.b = 66;
	Test1.this.b = 88;
}

總結:

  1. 普通內部類對象必須在先有外部類對象前提下才能創建
  2. 外部類中,不能直接訪問內部類中的成員,如果要訪問必須先要創建內部類的對象
  3. 外部類中的任何成員都可以被在普通內部類方法中直接訪問
  4. 在內部類方法中訪問同名的成員時,優先訪問自己的(就近原則),如果要訪問外部類同名的成員,必須:外部類名稱.this.同名成員 來訪問

靜態內部類

被 static 修飾的內部成員類稱為靜態內部類

public class Test2 {
    int a;
    int b;
    static int c;
    static void method1(){
        System.out.println("我是method()");
    }
    static class InnerClass{
        int d;
        static int e;
        void method2(){

        }
    }
}

靜態內部類對象的創建

1.同文件中創建:

//靜態成員變量的訪問
System.out.println(Test2.c);

//不需要借助外部類對象來創建
InnerClass innerClass = new InnerClass();

2.不同文件裡 創建:

void test2(){
    //靜態成員變量的訪問:
    System.out.println(Test2.c);

    //靜態內部類對象 (類比靜態成員變量的訪問)
    Test2.InnerClass t = new Test2.InnerClass();
    //靜態內部類對象可以直接創建,不需要依賴外部類對象

}

靜態內部類方法裡能否訪問外部類的對象?

在這裡插入圖片描述

由上圖可得到:在靜態內部類中,隻能訪問外部類中的靜態成員變量和靜態成員方法

註意事項:

  • 在內部類中隻能訪問外部類中的靜態成員
  • 在同一文件中創建內部類對象時,可以直接創建,不需要借助外部類對象
  • 在不同文件中創建內部類對象時,也可直接創建:所在文件名稱.內部類名稱.對象名
  • 成員內部類,經過編譯之後會生成獨立的字節碼文件,命名格式為:外部類名稱$內部類名稱

在這裡插入圖片描述

局部內部類

定義在外部類的方法體或者 { } 中,該種內部類隻能在其定義的位置使用,一般很少使用

//外部類
public class OutClass {

    public void method(){
        //局部內部類
        class InnerClass3{

        }
    }
	{   //局部內部類
		class InnerClass4{

		}
    }
}

不能被訪問修飾限定符修飾:

在這裡插入圖片描述

不能再局部內部類中定義靜態成員

在這裡插入圖片描述

不能再局部內部類中定義靜態方法

在這裡插入圖片描述

註意事項:

局部內部類隻能在所定義的方法體內部使用不能被public、static等修飾符修飾編譯器也有自己獨立的字節碼文件,命名格式:外部類名字$x內部類名字.class,x是一個整數 匿名內部類(這裡不做講解)

總結

到此這篇關於Java中內部類的概念與分類的文章就介紹到這瞭,更多相關Java內部類內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: