道阻且長,行則將至。埋頭苦幹,不鳴則已,一鳴驚人!加油,騷年!
目錄及資源索引
1 什麼是內部類?
內部類:一個類定義在另一個類的裏邊,就把這種類稱爲內部類;代碼舉例如下:
class A
{
class B
{
}
}
此時如果直接編譯,編譯結果會是什麼樣呢?編譯出來會有 2 個 class 文件,如下圖:
其中 A$B.class 就是內部類生成的類文件;
內部類編譯後的名字,就是:外部類名$內部類名.class。
2 內部類有哪些語法特徵?
2.1 如何生成內部類對象?
還是使用上述類文件,此時再重新創建一個類,用來存放 main 函數,程序內容如下:
class Test
{
public static void main(String args[])
{
A a = new A(); // 生成類A 對象
A.B b = new A().new B(); // 生成子類B 對象
}
}
2.2 內部類成員變量/函數的使用方法
我們先修改第一節的類文件,在其中添加部分成員變量,用以測試,具體代碼如下:
class A
{
int i;
class B
{
int j;
int funB()
{
int result = i + j;
System.out.println(result); // 添加result打印,調試用
return result;
}
}
}
此時再修改 main 函數,分別給類 A,類 B 中的成員變量賦值,查看函數輸出結果
class Test
{
public static void main(String args[])
{
A a = new A(); // 生成類A 對象
A.B b = a.new B(); // 生成子類B 對象
a.i = 3;
b.j = 1;
b.funB();
}
}
上述代碼,編譯運行後,結果如下:
由代碼及運行結果分析可得:
- 內部類可以隨意使用外部類定義的成員變量。
- B 是 A 的內部類,意味着在B當中可以隨意使用 A 當中的成員變量和成員函數,但是這不意味着 B 繼承了 A,只是能使用而已,但是 B 並不擁有這些成員變量。
- 每一個內部類的對象都和一個外部類的對象相關聯。也就是說有內部類對象,必然有一個跟他關聯的外部類對象。
- 實際在內部類 B 中使用的變量 i ,就是外部類中的成員變量。
3 匿名內部類
匿名內部類:首先是內部類,其次沒有名字,就叫匿名內部類;
下邊用具體的代碼進行實現,新建一個接口類 A
interface A
{
public void doSomething();
}
接着定義一個類 B
class B
{
public void fun(A a)
{
System.out.println("B類的fun函數");
a.doSomething();
}
}
此時類 B 需要一個 A 類型的對象,作爲參數,還需要一個接口 A 的子類,因爲 A 不能直接生成對象,具體如下:
class AImpl implements A
{
public void doSomething()
{
System.out.println("doSomething");
}
}
此時對主函數稍作修改,具體代碼如下:
class Test
{
public static void main(String args[])
{
AImpl al = new AImpl(); // 生成子類對象
A a = al; // 向上轉型
B b = new B();
b.fun(a); // 傳進去類型爲A的參數
}
}
上述代碼編譯運行結果如下:
注意,如果此時使用匿名內部類,就會有一個不太正常的寫法,修改主函數代碼如下:
class Test
{
public static void main(String args[])
{
// AImpl al = new AImpl(); // 生成子類對象
// A a = al; // 向上轉型
B b = new B();
b.fun(new A()
{
public void doSomething()
{
System.out.println("匿名內部類");
}
}
);
}
}
上述代碼重新編譯後,運行結果如下圖:
對匿名內部類代碼及編譯結果進行分析如下:
- 類B 的 fun 函數需要一個 A 類型的對象,和之前那個 AImpl 基本類似,但是沒有名字;
- new A() 不能直接用,後邊必須要跟上實現接口的類,但是沒有名字,就叫匿名類;
4 總結
- 瞭解內部類,內部類的基本語法特徵,實現方式等;
- 瞭解內部類成員變量、成員函數的使用方法,作用範圍等;
- 簡單瞭解匿名內部類,特徵及實現方式等。
如果文章內容有誤,麻煩評論/私信多多指教,謝謝!如果覺得文章內容還不錯,留個讚唄,您的點贊就是對我最大的鼓勵,謝謝您嘞!