1. 程式人生 > >Java 抽象方法例項化

Java 抽象方法例項化

通過查詢Java的API發現:抽象類有構造方法,而介面沒有構造方法。 抽象類不可以直接建立物件,表示抽象類本身不能被例項化,即 抽象類 a = new 抽象類();這樣寫是錯誤的,但是抽象類可以宣告物件,因為,抽象類的子類必須複寫抽象類中的所有抽象方法,即抽象類的子類是可以直接例項化的,所以,通過父類的引用來指向子類的例項來間接地實現父類的例項化,這是父類引用指向子類物件的多型機制的體現。

比如:public abstract class Toolkit extends Object ,Toolkit 是抽象類,不能直接通過new建立物件,但是 這個抽象類Toolkit 有構造方法 public

Toolkit() ,它提供靜態

public static Toolkit getDefaultToolkit()給Toolkit建立物件,即有很方法會返回抽象類Toolkit 的例項,像public static ToolkitgetDefaultToolkit()返回預設工具包。抽象類是無法通過 new 關鍵字建立物件的,但是這裡為什麼會返回抽象類抽象類的應用呢?抽象類的例項
是怎麼建立的呢?Toolkit i = Toolkit.getDefaultToolkit(); 這句話並沒有例項化抽象類Toolkit ,Toolkit i 只是宣告一個型別為Toolkit 的變數 i , Toolkit.getDefaultToolkit(); 是獲取抽象
類 Toolkit 的一個例項物件。從Toolkit.getDefaultToolkit(); 中所獲得的例項其實就是一個Toolkit 的子類的物件,它實現了Toolkit 裡面的抽象方法。
使用Toolkit.getDefaultToolkit(); 的好處:
1、new一定要生成一個新物件,分配記憶體;Toolkit.getDefaultToolkit(); 則不一定要再次建立,它可以把一個已存在的引用給你使用,這在效能上優於new;
2、new建立後只能當次使用,而Toolkit.getDefaultToolkit(); 可以跨棧區域使用,或者遠端跨區域使用。所以Toolkit.getDefaultToolkit(); 通常是建立static靜態例項方法的。
   抽象類其實是可以例項化的,但是它的例項化方式不是通過new方式來建立物件,而是通過父類的引用來指向子類的例項來間接地實現父類的例項化(因為子類要例項化前,一定會先
例項化他的父類。這樣建立了繼承抽象類的子類的物件,也就把其父類(抽象類)給例項化了),但是,介面是不能被例項化的(介面壓根就沒有建構函式)

public class CC {
public static void main(String[] args) {
A a = new B();
a.my1();
a.my();
System.out.println(a.i);
System.out.println(((B) a).i);


}
}
abstract class A {
int i = 0;


public void my() {
System.out.println("A my");
}


abstract void my1();
}


class B extends A {
int i = 1;


public void my1() {
System.out.println("B A my1");
}
}

執行結果為: