內部類
內部類:定義在一個類裏面的類。一般的內部類包括:成員內部類、局部內部類、匿名內部類和靜態內部類 ,下面我們說一下成員內部類和靜態內部類
一、成員內部類
成員內部類是最普通的內部類,定義在一個類的裏面,代碼如下
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修飾,靜態內部類不依託於外部類(靜態內部類模板被放在元數據區裏),並且靜態內部類不能調用外部類的動態屬性或方法。這點與之前講的靜可調動,但動不能調靜一樣。
- 在外部類加載的時候,靜態內部類也隨之加載,它的完整類名是,編譯後的class的文件名爲。
- 由於靜態內部類是靜態的,所以它無法訪問外部類的非靜態成員。
- 其實,靜態內部類相對外部類來說,幾乎是獨立的,它可以在沒有外部類對象的情況下,單 獨創造一個內部類的對象。
- 從某種程度來說,公開的靜態內部類就相當於一個普通的類。
- 其相對於外部類來說,僅僅是包含關係,縮小了命名空間,完整類名中多了一個外部類的名稱。
- 本質上是兩個獨立的類,JVM也不知道它們兩個有包含關係。
三、內部類的作用:
1.解決多繼承問題
我們都知道Java中不存在多繼承,如果要想實現多繼承就需要通過接口。這裏我們也可以通過內部類來實現,具體實現來看代碼
public class TestInnerClass extends A {
//內部類
public class InnerClass extends B{
//這裏既可以用父類A的屬性方法,也能用B的屬性方法,相當於實現了多繼承
}
}
2.方便將存在一定邏輯關係的類組織在一起,又可以對外界隱藏。
平時我們對類的訪問權限都是通過類前面的訪問修飾符來限制的,一般的外部類,只能是public或default的,但內部類可以被四種訪問控制符修飾,所以我們能通過內部類來隱藏我們的信息。
學習參考