Java的抽象類例項化
阿新 • • 發佈:2018-12-22
簡介
《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,