Java的抽象類實例化

簡介

《Java編程思想》書中定義抽象類:“包含抽象方法的類”。即如果一個類含有抽象方法,則稱這個類爲抽象類。
抽象類必須在類前用abstract關鍵字修飾。因爲抽象類中含有無具體實現的方法,所以一般不能用抽象類創建對象。

// 抽象類
public abstract class ClassName {
    // 抽象方法:只有聲明,而沒有具體的實現
    abstract void fun();
}

注意有些類是有abstract修飾,但是沒有abstract方法,比如Android AIDL的內部靜態abstract類Stub

如何實現抽象類的實例化

上面說到一般情況下abstract類是不能夠實例化,但下面兩種情形下是可以的

通過abstract 父類的引用來指向子類的實例,子類A繼承abstract 父類B,B aa=new A(“a”);

```
abstract class B {
    private String str;

    public B(String a) {
        this.str=a;
        System.out.println("父類已經實例化" + str);
    }

    public abstract void play();
}

public class A extends B{

    public A(String a) {
        super(a);
        System.out.println("子類已經實例化");
    }

    @Override
    public void play() {
        System.out.println("我實現了父類的方法");
    }

    public static void main(String[] args) {
        B aa=new A("a");
    }
}
```

Android中的AIDL有個例子,AIDL的Stub類

public interface IBookManager extends android.os.IInterface
{
    /** Local-side IPC implementation stub class. */
    public static abstract class Stub extends android.os.Binder implements com.vv.ipc.IBookManager
    {
        private static final java.lang.String DESCRIPTOR = "com.vv.ipc.IBookManager";
        /** Construct the stub at attach it to the interface. */
        public Stub()
        {
        this.attachInterface(this, DESCRIPTOR);
        }
        ......
    }
}

// 匿名類實例化,Stub的構造函數有使用this調用方法
private Binder mBinder = new IBookManager.Stub() {
......
}

抽象類和Interface的區別

在Java中,可以通過兩種形式來體現OOP面向對象的抽象:接口(interface)和抽象類(abstract)

接口是一種極度抽象的類型,它比抽象類更加“抽象”。一般情況下不在接口中定義變量。兩者之前還是有一定區別

比較對象 修飾符 變量作用域 方法 繼承 使用場景
abstract class abstract 無要求 可以存在abstract方法和非abstract 方法,public或者protected作用域 extends只能繼承一個abstract class 適用於對一種事物的抽象,即對類抽象,包括類的屬性、行爲。如果是這類就繼承它
interface interface 必須是 public static final變量 必須是public abstract方法 implements可以同時實現很多接口 適用於對類局部行爲的抽象,如果有這個行爲就實現它。

PS: OOP - Object Oriented Programming,

發佈了153 篇原創文章 · 獲贊 20 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章