內部類總結

2022-07-30 09:36:12 字數 3050 閱讀 2307

內部類:定義在乙個類的內部的類就是內部類,也叫內建類,內嵌類

1、內部類訪問外部類:

在內部類中可以直接訪問外部類中的非靜態成員,即不用建立外部類的物件,就可以直接訪問外部類的非靜態成員。

原因是:內部類成員方法在訪問外部類中的非靜態成員時省略了outer.this,本質上還是先拿到外部類的物件

才訪問外部類的非靜態成員的。不用程式設計師在內部類中顯示的引用外部類的物件,在建立內部類的物件時必須先創

建外部類的成員,所以內部類方法會現在本方法內查詢,再在本類中查詢,最後到外部類中查詢,並通過outer.this

拿到外部類物件,繼而引用外部類的非靜態成員。

必須用 outer.this 和 this 以示區分外部類物件和內部類物件。

2、外部類訪問內部類:

外部類訪問內部類必須建立內部類的物件,通過內部類的物件才能訪問內部類中的非靜態成員。

3、乙個類中可以定義多個內部類

4、內部類的定義和普通其他類一樣,也可以定義成員方法和成員變數

5、只有內部類可以被私有化(即被private修飾,只供在外部類中使用),外部類不可以被私有化,否則編譯報錯。

外部類只能有兩種修飾,預設和public,private只修飾成員,而內部類處在成員的位置上,所以可以被修飾。

內部類處在成員位置上,所以所有成員修飾符都可以用來修飾內部類。

比如:static、private

static修飾的內部類中的成員可以使靜態的也可以是非靜態的。

****

先明確static關鍵字的本質含義:靜態的乙個本質含義:

static修飾**段時,用來標識出該段**段中的內容不同於其他非靜態**段。當其需要訪問static修飾的

**段外部的內容時,則該內容必須保證為靜態(無論是**段還是成員變數)。但是在**段內部仍然可以

建立區域性變數,使用其他的類都沒有問題。相當於static對外有要求,對內沒有要求。比如outer.this會被

看做成外部的,所以其代表的是外部的非靜態變數,所以編譯會報錯,而內部類的this是內部的,所以其代表

的是內部的非靜態變數,相當於**段內的區域性變數,所以是可以非靜態的,編譯會通過。

根據1,內部類是非靜態時,當建立內部類的物件時必須通過外部類的物件,這樣做是因為內部類的成員中可以

直接訪問外部類中的非靜態成員。然而當內部類為靜態時,就切斷了這層聯絡,即內部類定義這個大括號(**

段中)中若要訪問外部類的成員,則必須是訪問靜態的成員,而訪問外部類中的靜態成員可以不用外部類的

物件,所以就打破了這層聯絡,所以不需通過外部類物件,所以建立靜態內部類物件時,不用先建立外部類

物件,即不用通過建立外部類物件來建立靜態內部類的物件。

當在外部類的靜態方法中建立非靜態內部類的物件時,編譯會報錯,因為靜態方法的訪問不需要建立外部類

物件,而非靜態的內部類的物件有可能引用到外部類中的非靜態成員,而在靜態方法中是不會有外

部類物件的(即this),而內部類物件的建立必須通過外部類物件即this。所以就會出錯。

而當把內部類宣告為靜態的時候,就可以在外部類的靜態方法中建立內部類的物件了,因為建立靜態內部類

不需要用到外部類物件(即this),所以就是完全正確的了。而在外部類中的非靜態方法中建立非靜態的

內部類物件時,雖然沒有明確用new outer().new inner()的方式,即沒有顯示使用外部類物件建立非靜態

內部類物件,但實際上還是用到了,是使用this,即相當於this.new inner()。

靜態的另乙個本質含義:訪問方式的特殊性,可以用類名.靜態成員的方式訪問。

****

1# 外部其他類中訪問靜態內部類中的非靜態成員變數。

在其他外部類中直接建立靜態內部類物件

outer.inner in = new outer.inner();

因為內部類inner是靜態的,不會用到外部類outer中的非靜態成員,所以不用建立乙個匿名的外部類outer

物件。直接建立乙個內部類物件就可以了。

在外部類中直接建立靜態內部類物件

inner in = new inner();

2# 外部其他類中訪問靜態內部類中的靜態成員

訪問方式:外部類類名.內部類類名.靜態成員

outer.inner.function();

6、成員訪問上,內部類和外部類相當於兩個命名空間,內部的可以直接引用外部的。在其他類中要宣告內部類的引用,

就需要用完全限定名稱訪問即「外部類名.內部類名」,而在外部類中使用內部類時就只需要用「內部類名」就可以了。

所以不管是建立靜態內部類還是非靜態內部類都必須用「外部類名.內部類名」來標誌內部類名,當在其他外部類使用

該內部類時,因為可能外部類outer1,outer2中都有乙個inner的內部類,單純的靠內部類inner的名稱,編譯器無法

確定是要使用哪乙個內部類。

7、其他外部類訪問非靜態內部類,若內部類沒有被私有化,則可以通過直接建立內部類物件來訪問非靜態成員。

訪問方式: 外部類名.內部類名 變數名 = 外部類物件.內部類物件

outer.inner in = new outer().new inner();

注意:這種訪問方式,即建立內部類物件的方式不可以用於建立靜態內部類物件,否則編譯報錯

eg. outer.inner4 in4 = new outer().new inner4();//inner4是靜態內部類。

必須用:outer.inner4 in4 = new outer.inner4();//這是正確的建立靜態內部類的方式。

注意:內部類中如果有靜態的方法,則內部類也要被static修飾

外部類中的靜態方法中訪問到內部類,則內部類也要被static修飾。

注:以上講的內部類只是成員內部類,即內部類定義在外部類的成員位置上。

測試**:

class outer

outer(int x)

static class inner }

static class inner2 }

class inner3 }

void method()

public static void show()

}

內部類總結

1內部類的巢狀可以理解成類的鏈關係,在構造乙個內部類 非static 的例項的時候,會將直接外層類的例項 作為引數傳進建構函式,而外層類的例項也是用其外層類的例項構造,所以是一種鏈狀關係,內部的類可以使用所有 外層的類的例項,而外層的類不能使用內層的類,應用a.this 最外層類例項 a.b.c.t...

內部類總結

內部類不是很好理解,但說白了其實也就是乙個類中還包含著另外乙個類 如同乙個人是由大腦 肢體 器官等身體結果組成,而內部類相當於其中的某個器官之一,例如心臟 它也有自己的屬性和行為 血液 跳動 顯然,此處不能單方面用屬性或者方法表示乙個心臟,而需要乙個類 而心臟又在人體當中,正如同是內部類在外部內當中...

內部類總結

內部類不是很好理解,但說白了其實也就是乙個類中還包含著另外乙個類 如同乙個人是由大腦 肢體 器官等身體結果組成,而內部類相當於其中的某個器官之一,例如心臟 它也有自己的屬性和行為 血液 跳動 顯然,此處不能單方面用屬性或者方法表示乙個心臟,而需要乙個類 而心臟又在人體當中,正如同是內部類在外部內當中...