一 : 內部類的定義
內部類( InnerClass )就是定義在另外一個類裏面的類。與之對應,包含內部類的類被稱爲外部類。
內部類的主要作用如下:
1.內部類提供了更好的封裝,可以把內部類隱藏在外部類之內,不允許同一個包中的其他類訪問該類
2. 內部類的方法可以直接訪問外部類的所有數據,包括私有的數據
3. 內部類所實現的功能使用外部類同樣可以實現,只是有時使用內部類更方便
內部類可分爲以下幾種:
1.成員內部類
2.靜態內部類
3.方法內部類
4.匿名內部類
下面是一個內部類的舉例:
//外部類HelloWorld
public class HelloWorld {
// 內部類Inner,類Inner在類HelloWorld的內部
public class Inner {
// 內部類的方法
public void show() {
System.out.println("welcome to imooc!");
}
}
public static void main(String[] args) {
// 創建外部類對象
HelloWorld hello= new HelloWorld();
// 創建內部類對象
Inner i = hello.new Inner();
// 調用內部類對象的方法
i.show();
}
}
運行結果如下:
welcome to imooc!
二:Java中的成員內部類
內部類中最常見的就是成員內部類,也稱爲普通內部類。我們來看如下代碼:
public classOuter {
private int a=9;//外部類的私有屬性
//定義一個內部類
public class Inner{
int b=2;//內部類的成員屬性
public void test(){
System.out.println("訪問外部類中的a:"+a);
System.out.println("訪問內部類中的b:"+b);
}
}
public static void main(String[] args) {
// 創建外部類對象o
Outer o=new Outer();
//使用外部類對象創建內部類對象i
Inner i=o.newInner();
//調用內部類方法
i.test();
}
}
運行結果如下:訪問外部類中的a:9
訪問內部類中的b:2
從上面的代碼中我們可以看到,成員內部類的使用方法:
1、 Inner 類定義在 Outer 類的內部,相當於 Outer 類的一個成員變量的位置,Inner 類可以使用任意訪問控制符,如 public 、 protected 、 private 等
2、 Inner 類中定義的 test() 方法可以直接訪問 Outer 類中的數據,而不受訪問控制符的影響,如直接訪問 Outer 類中的私有屬性a
3、 定義了成員內部類後,必須使用外部類對象來創建內部類對象,而不能直接去 new 一個內部類對象,即:內部類對象名 = 外部類對象.new 內部類( );
注意一下幾點:1.外部類是不能直接使用內部類的成員和方法滴
可先創建內部類的對象,然後通過內部類的對象來訪問其成員變量和方法。
2. 如果外部類和內部類具有相同的成員變量或方法,內部類默認訪問自己的成員變量或方法,如果要訪問外部類的 成員變量,可以使用 this 關鍵字。如
三:Java中的靜態內部類
靜態內部類是 static 修飾的內部類,這種內部類的特點是:
1、靜態內部類不能直接訪問外部類的非靜態成員,但可以通過 new 外部類().成員 的方式訪問
2、 如果外部類的靜態成員與內部類的成員名稱相同,可通過“類名.靜態成員”訪問外部類的靜態成員;如果外部 類的靜態成員與內部類的成員名稱不相同,則可通過“成員名”直接調用外部類的靜態成員
3、 創建靜態內部類的對象時,不需要外部類的對象,可以直接創建 內部類對象名= new 內部類();
運行結果如下:
訪問外部類中的b:1
訪問內部類中的b:2
四:Java中的方法內部類
方法內部類就是內部類定義在外部類的方法中,方法內部類只在該方法的內部可見,即只在該方法內可以使用,如下 代碼:
//外部類
public classHelloWorld {
privateString name= "愛慕課";
// 外部類中的show方法
publicvoidshow() {
// 定義方法內部類
class MInner {
int score = 83;
public int getScore() {
return score + 10;
}
}
// 創建方法內部類的對象
MInner mi=new MInner();
// 調用內部類的方法
int newScore=mi.getScore();
System.out.println("姓名:" + name + "\n加分後的成績:" + newScore);
}
// 測試方法內部類
public static void main(String[] args) {
// 創建外部類的對象
HelloWorld hello=new HelloWorld();
// 調用外部類的方法
hello.show();
}
}
運行結果如下:
姓名:愛慕課
加分後的成績:93
一定要注意哦:由於方法內部類不能在外部類的方法以外的地方使用,因此方法內部類不能使用訪問控制符和 static 修飾符。
五:Java中的匿名內部類