分享知識 傳遞快樂
Java中的内部類
例:
public class 外部類的名稱{
//外部類的成員
public class 内部類的名稱{
//内部類的成員
}
}
使用内部類有什麼好處:
- 實作多重繼承;
- 内部類可以很好的實作隐藏:一般的非内部類,是不允許有 private 與protected權限的,但内部類可以;
- 減少了類檔案編譯後的産生的位元組碼檔案的大小。
**使用内部類的缺點:**使程式結構不清楚。
内部類在編譯完成後也會産生.class檔案,但檔案名稱是:外部類名稱$内部類名稱.class
内部類的種類:成員内部類、靜态内部類、局部内部類、匿名内部類。下面分别詳細學習一下這四種内部類的具體使用。
一、成員内部類
1、成員内部類也叫執行個體内部類。
應用場合:每一個外部類對象都需要一個内部類的執行個體,内部類離不開外部類存在(相當于心髒對人體)
2、成員内部類的特征:
- 作為外部類的一個成員存在,與外部類的屬性、方法并列;
- 成員内部類持有外部類的引用;
- 成員内部類中不能定義static變量和方法。
代碼:
public class App {
private String name = "成員内部類 - 1";
public static void main(String[] args) throws Exception {
//方法一:
// App app = new App();
// InnerApp innerApp = app.new InnerApp();
// innerApp.show();
//方法二:
App.InnerApp innerApp = new App().new InnerApp();
innerApp.show();
System.out.println(innerApp.name);
}
public class InnerApp {
private String name = "成員内部類 - 2";
public void show() {
System.out.println(App.this.name);
System.out.println("内部類!");
}
}
}
二、靜态内部類
1、内部類如果使用static聲明,則此内部類就稱為靜态内部類。(其實也相當于外部類)可以通過外部類 . 内部類來通路。
2、靜态内部類使用場合:
内部類不需要外部類的執行個體(注意區分成員内部類),靜态内部類存在僅僅為外部類提供服務或者邏輯上屬于外部類,且邏輯上可以單獨存在。
3、靜态内部類的特征:
- 靜态内部類不會持有外部類的引用;
- 靜态内部類可以通路外部的靜态變量,如果通路外部類的成員變量必須通過外部類的執行個體通路
4、Java中隻有内部類才可以是靜态的
代碼:
public class App {
String name = "靜态内部 - 1";
public static void main(String[] args) throws Exception {
App.InnerApp innerApp = new App.InnerApp();
innerApp.print();
}
static class InnerApp {
String name = "靜态内部 - 2";
public void print() {
System.out.println(name);
}
}
}
三、局部内部類
1、局部内部類也叫區域内嵌類,局部内部類與成員内部類類似,不過,區域内嵌類是定義在一個方法中的内嵌類。
2、使用場合:
如果内部類對象僅僅為外部類的某個方法使用,使用局部内部類
3、特征:
- 用在方法内部,作用範圍僅限于該方法中;
- 根據情況決定持有外部類對象引用;
- 不能使用private,protected,public修飾符;
- 不能包含靜态成員。
代碼:
public class App {
String name = "局部内部類 - 1";
public static void main(String[] args) {
App app = new App();
app.show();
}
public void show() {
final String name = "局部内部類 - 2";
class InnerApp {
public void print() {
System.out.println(name);
}
}
new InnerApp().print();
}
}
四、匿名内部類
1、如果一個内部類在整個操作中隻使用一次的話,就可以定義為匿名内部類。
匿名内部類也就是沒有名字的内部類,這是java為了友善我們編寫程式而設計的一個機制,因為有時候有的内部類隻需要建立一個它的對象就可以了,以後再不會用到這個類,這時候使用匿名内部類就比較合适。
2、使用場合:
簡化内部類的使用
3、特征:
- 使用new建立 ,沒有具體位置;
- 建立的匿名類,預設繼承或實作new後面的類型;
- 根據使用情況決定是否持有外部類對象引用;
- 内嵌匿名類編譯後生成的.class檔案的命名方式是”外部類名稱$編号.class”,編号為1,2,3…n,編号為x的檔案對應的就是第x個匿名類
代碼:
public class App {
String name = "匿名内部類 - 1";
public static void main(String[] args) {
Person p = new Person() {
public void run() {
System.out.println("匿名内部類實作的");
}
};
p.run();
}
}
public interface Person {
public void run();
}
————————————