Java 內部類、匿名內部類、抽象類
何為內部類
內部類是指 在一個類中在定義一個類
如:
1.成員內部類
public class F {
private int a;
public void fun(){
//TODO
}
public class M{
private int a;
public void fun(){
//TODO
}
}
}
2.區域性內部類
public class F {
private int a;
public void fun(){
//TODO
class M{
private int a;
public void fun(){
//TODO
}
}
M m = new M();
m.fun();
}
}
值得注意的是:
1 . 無論是成員內部類還是區域性內部類,內部類中定義的方法名和變數名可以和外部類相同。這是因為 當程式正確編譯後,會生成兩個class檔案,即:F.class和F$M.class,且這兩個class檔案是兩個不同的檔案,故可以重名
2 . 上述內部類例項的存在必須依賴於父類的例項,
即:在外接使用內部類時,必須先new 一個F的例項,然後在呼叫F.new M()生成M的例項物件3 . 若內部類是static修飾過的,即靜態內部類,這直接new一個靜態內部類物件即可,注意要匯入正確的包,它位於父類下。
4. 靜態內部類引數必須用final修飾的原因:
靜態內部類不依賴父類的例項的存在而存在
我們知道靜態方法、靜態成員變數隨著類的載入而產生,不依賴與任何物件的存在
靜態內部類解除了與外部類的關聯,不持有外部類的引用
Java 物件的初始化順序:
- 靜態物件-非靜態物件-構造器
其中靜態物件包括:靜態塊,靜態方法,靜態屬性- 對於繼承父類的物件的初始化順序:父類靜態物件-子類靜態物件-父類構造方法-子類構造方法
說明:在靜態物件中初始話順序實際上是按照宣告的順序執行的。
3.匿名內部類
在Android開發中常用到如:
button.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View v) {
// TODO
}
});
其中的new Button.onclickListener(){}即為匿名內部類的例項物件類
匿名內部類要求:
1. 匿名內部類沒有名字,因此只能使用一次,下次再使用重新建立物件。
2. 匿名內部類的適用情形:某個類不是經常使用,如只使用一次,使用完後不儲存該例項的物件,為了便於程式碼的編寫常採用匿名內部類
3. 使用匿名內部類的前提條件:必須繼承一個父類或實現一個介面
其他說明:
無論是匿名內部類、介面或者抽象類,都不能例項化
但我們常用到的new 一個匿名內部類、介面或者抽象類實際上是執行3步的合併,即:
a.先定義一個子類,讓該子類繼承上述介面或實現上述抽象類;
b.然後new一個該子類的物件;
c.將該子類的一個引用賦值給介面或者抽象類變數(它是依據java多型特性:父類指向子類的引用)。
上述說明事例程式碼:
1. new 一個介面
Runnable runnable = new Runnable() {
@Override
public void run() {
}
};
- 實際上的執行步驟為:
a.
class MyRunnable implements Runnable{
@Override
public void run() {
}
}
b.
MyRunnable myRunnable = new MyRunnable();
c.
Runnable runnable = myRunnable;