菜鳥學JAVA之——內部類

內部類

內部類:定義在一個類裏面的類。一般的內部類包括:成員內部類、局部內部類、匿名內部類和靜態內部類 ,下面我們說一下成員內部類和靜態內部類

一、成員內部類

成員內部類是最普通的內部類,定義在一個類的裏面,代碼如下

public class TestInnerClass {
	private int f = 1; 
    //內部類
    public class InnerClass {
        private int a = 1;
        private void test() {
            f = 6;
            System.out.println(f);//在內部類中,不用創建對象就可以調用外部類的所有屬性和方法(包括私有的)
        }
    }
    public void foo() {
        InnerClass innerClass = new InnerClass();
        System.out.println(innerClass.a); //而在外部類中調用內部類中的任何東西都需要先創建內部類對象
        innerClass.test();
   }
}

在內部類中,不用創建對象就可以調用外部類的屬性,而在外部類中調用內部類中的任何東西都需要先創建內部類對象。 爲什麼?

這兩個類屬於所屬型級別,InnerClass這個類是TestInnerClass這個類的從屬,內部類包含外部類的屬性方法。這裏可以把內部類理解爲外部類的一個方法,但是他也是一個類,外部類想要訪問他,還是需要先創建對象才能調用它內部的屬性方法。

這裏需要注意:如果成員內部類與外部類的屬性名或方法名重名時,則外部類的這些屬性方法會被隱藏,即默認情況下訪問的是成員內部類的成員。如果要訪問外部類的成員需要爲以下格式

外部類.this.成員變量

外部類.this.成員方法

舉個例子

class TestInnerClass {
    private int a = 1;
    class InnerClass {
        private int a = 2;
        public void print() {
            int a = 3;
            System.out.println("局部變量:" + a);
            System.out.println("內部類變量:" + this.a);
            System.out.println("外部類變量:" + TestInnerClass.this.a);
        }
    }
}

public class Main {
    public static void main(String[] args) {
        TestInnerClass.InnerClass i = new TestInnerClass().new InnerClass();
        i.print();
        //輸出  3
        //     2
        //     1
    }
}

內部類對象的創建

**成員內部類是依附外部類而存在的,也就是說,如果要創建成員內部類的對象,前提是必須存在一個外部類的對象。**創建成員內部類對象的一般方式如下:

TestInnerClass.InnerClass c = new TestInnerClass().new InnerClass();

如果不想創建外部類對象就創建內部類對象,這就需要內部類是靜態的(靜態內部類),創建靜態內部類對象的一般方式如下:

TestInnerClass.InnerClass i = new TestInnerClass.InnerClass();

二、靜態內部類

靜態內部類同樣是定義在一個類裏面,但是需要被static修飾,靜態內部類不依託於外部類(靜態內部類模板被放在元數據區裏),並且靜態內部類不能調用外部類的動態屬性或方法。這點與之前講的靜可調動,但動不能調靜一樣。

  1. 在外部類加載的時候,靜態內部類也隨之加載,它的完整類名是,編譯後的class的文件名爲。
  2. 由於靜態內部類是靜態的,所以它無法訪問外部類的非靜態成員。
  3. 其實,靜態內部類相對外部類來說,幾乎是獨立的,它可以在沒有外部類對象的情況下,單 獨創造一個內部類的對象。
  4. 從某種程度來說,公開的靜態內部類就相當於一個普通的類。
  5. 其相對於外部類來說,僅僅是包含關係,縮小了命名空間,完整類名中多了一個外部類的名稱。
  6. 本質上是兩個獨立的類,JVM也不知道它們兩個有包含關係。

三、內部類的作用:

1.解決多繼承問題

我們都知道Java中不存在多繼承,如果要想實現多繼承就需要通過接口。這裏我們也可以通過內部類來實現,具體實現來看代碼

public class TestInnerClass extends A {
    //內部類
    public class InnerClass extends B{
       //這裏既可以用父類A的屬性方法,也能用B的屬性方法,相當於實現了多繼承
    }
}

2.方便將存在一定邏輯關係的類組織在一起,又可以對外界隱藏。

平時我們對類的訪問權限都是通過類前面的訪問修飾符來限制的,一般的外部類,只能是public或default的,但內部類可以被四種訪問控制符修飾,所以我們能通過內部類來隱藏我們的信息。

學習參考

https://www.runoob.com/w3cnote/java-inner-class-intro.html

https://www.iteye.com/blog/luhantu-1933263

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