內部類
內部類的引入
提高了類成員的安全性
內部類概述
把類定義在類的內部,A 類中定義 B類, A類相對於B類就是外部類,B類相對於A類就是內部類
內部類分類
1.成員內部類
2.局部內部類
3.靜態內部類
4.匿名內部類
內部類特點
1.內部類編譯後生成class文件的格式: 外部類類名$內部類類名
2.內部類可以訪問外部類的所有成員,包括私有成員
3.外部類訪問內部類成員,必須創建內部類對象
4.外界訪問外部類成員,創建外部類對象,訪問內部類對象需要同時創建外部類和內部類對象
5.內部類將類和類之間產生了關係,提高了耦合性,降低可讀性,慎用
1.成員內部類類
概述: 把類定義在類內部的成員位置
訪問格式:
外部類類名.內部類類名 對象名 = new 外部類對象().new 內部類對象();
注意: 當外部類成員名字和內部類成員名字重名的時候: 外部類類名.this.成員
代碼示例
class Fu {
int num = 50;
public void show() {
int num = 60;
System.out.println(num);
}
}
class Outer2 extends Fu{
int num = 40;
// 成員內部類
class Inner {
int num = 30;
public void show() {
int num = 20;
// 輸出20
System.out.println(____);
// 輸出30
System.out.println(____);
// 輸出40
System.out.println(____);
// 輸出50
System.out.println(____);
// 輸出60
____
}
}
}
2.局部內部類
概述: 把類定義在類內部的局部位置
理解爲局部變量即可
訪問局部內部類成員: 局部內部類只能夠在局部創建對象來訪問
代碼示例
class Outer3 {
public void show() {
class InnerX {
int num = 20;
public void show() {
System.out.println("Outer3.show().Inner.show()");
}
}
InnerX innerX = new InnerX();
System.out.println(innerX.num);
innerX.show();
}
}
3.靜態內部類
概述:把類定義在類的內部類,並且使用static關鍵字修飾內部類
訪問格式: 外部類類名.內部類類名 對象名 = new 外部類類名.內部類類名();
如果在外部類訪問靜態內部類成員
內部類靜態成員: 類名.靜態成員
內部類非靜態成員: 對象.非靜態成員
如何在外界訪問靜態內部類成員
創建靜態內部類對象格式:
外部類.內部類 對象名 = new 外部類.內部類();
訪問靜態內部類非靜態成員
對象.非靜態成員
訪問靜態內部類靜態成員
對象.靜態成員
外部類類名.靜態內部類類名.靜態成員
代碼示例
public class InnerClassDemo05 {
public static void main(String[] args) {
Outer4 outer4 = new Outer4();
outer4.test();
Outer4.Inner oi = new Outer4.Inner();
System.out.println(oi.num);
// System.out.println(oi.num2);
System.out.println(Outer4.Inner.num2);
oi.show();
Outer4.Inner.staticMethod();
}
}
class Outer4 {
static String country;
static class Inner {
int num = 10;
static int num2 = 20;
public void show() {
System.out.println("show");
}
public static void staticMethod() {
System.out.println("staticMethod");
}
}
public void test() {
System.out.println(Inner.num2);
Inner inner = new Inner();
System.out.println(inner.num);
}
}
4.匿名內部類
概述
這個本質就是 一個 繼承/實現了某個類(接口,普通類,抽象類)的子類匿名對象
該類沒有類名, 類名叫做 外部類類名$數字
格式 :
new 類名() {
[重寫方法;]
};