1. 程式人生 > >Java 內部類、匿名內部類、抽象類

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 物件的初始化順序:

  1. 靜態物件-非靜態物件-構造器
    其中靜態物件包括:靜態塊,靜態方法,靜態屬性
  2. 對於繼承父類的物件的初始化順序:父類靜態物件-子類靜態物件-父類構造方法-子類構造方法
    說明:在靜態物件中初始話順序實際上是按照宣告的順序執行的。

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() {

            }
        };
  1. 實際上的執行步驟為:
a.
 class MyRunnable implements Runnable{

        @Override
        public void run() {

        }

    }
b.  
MyRunnable myRunnable = new MyRunnable();
c.
Runnable runnable = myRunnable;