抽象類是乙個宣告為abstract
的類 — 它可能包括也可能不包括抽象方法,抽象類無法例項化,但可以進行子類化。
抽象方法是在沒有實現的情況下宣告的方法(沒有大括號,後跟分號),如下所示:
abstract void moveto(double deltax, double deltay);
如果乙個類包含抽象方法,那麼該類本身必須被宣告為abstract
,如:
public abstract class graphicobject
當抽象類被子類化時,子類通常為其父類中的所有抽象方法提供實現,但是,如果沒有,那麼子類也必須宣告為abstract
。
注意:未宣告為抽象類與介面類似,你不能例項化它們,它們可能包含有或沒有實現宣告的方法的組合,但是,使用抽象類,你可以宣告非靜態和default
或static
的介面(參見介面部分)中的方法是隱式抽象的,因此
abstract
修飾符不用於介面方法(可以使用,但不需要)。
final
的字段,並定義public
、protected
和private
的具體方法。使用介面,所有欄位都自動為public
、static
和final
,並且你宣告或定義的所有方法(作為預設方法)都是public
,此外,你只能擴充套件乙個類,無論它是否是抽象的,而你可以實現任意數量的介面。
你應該使用哪個,抽象類或介面?
如果任何這些語句適用於你的情況,請考慮使用介面:
jdk中的抽象類的乙個示例是abstractmap,它是集合框架的一部分,它的子類(包括hashmap
、treemap
和concurrenthashmap
)共享abstractmap
定義的許多方法(包括get
、put
、isempty
、containskey
和containsvalue
)。
jdk中實現多個介面的類的乙個示例是hashmap,它實現了serializable
、cloneable
和map
介面。通過閱讀這個介面列表,你可以推斷出hashmap
的例項(無論是實現該類的開發人員或公司)可以轉殖,可序列化(這意味著它可以轉換為位元組流)。請參閱serializable objects
部分,並具有map的功能,此外,map
介面已經增強了許多預設方法,例如merge
和foreach
,實現此介面的舊類不必定義。
請注意,許多軟體庫都使用抽象類和介面,hashmap
類實現了幾個介面,並且還擴充套件了抽象類abstractmap
。
在物件導向的繪圖應用程式中,你可以繪製圓形、矩形、線條、貝塞爾曲線和許多其他圖形物件,這些物件都具有某些狀態(例如:位置、方向、線條顏色、填充顏色)和行為(例如:moveto
、rotate
、resize
、draw
)。所有圖形物件中的一些狀態和行為都是相同的(例如:位置、填充顏色和moveto
),其他需要不同的實現(例如,resize
或draw
)。所有graphicobjects
必須能夠自己繪製或調整大小,它們只是做的方式不同,這是抽象超類的完美情況。你可以利用相似性並宣告所有圖形物件從同乙個抽象父物件(例如,graphicobject
)繼承,如下圖所示。
首先,宣告乙個抽象類graphicobject
,以提供所有子類完全共享的成員變數和方法,例如當前位置和moveto
方法,graphicobject
還宣告了方法的抽象方法,例如draw
或resize
,它們需要由所有子類實現,但必須以不同的方式實現,graphicobject
類看起來像這樣:
abstract class graphicobject
abstract void draw();
abstract void resize();
}
graphicobject
的每個非抽象子類(例如circle
和rectangle
)必須提供draw
和resize
方法的實現:
class circle extends graphicobject
void resize()
}class rectangle extends graphicobject
void resize()
}
在介面一節中,注意到實現介面的類必須實現所有介面的方法,但是,可以定義乙個不實現所有介面方法的類,前提是該類被宣告為abstract
,例如:
abstract class x implements y
class xx extends x
在這種情況下,類x
必須是abstract
,因為它沒有完全實現y
,但實際上,類xx
實現了y
。
抽象類可以具有靜態欄位和靜態方法,你可以像使用任何其他類一樣使用帶有類引用的靜態成員(例如,abstractclass.staticmethod()
)。
java抽象類和抽象方法
抽象類就是不能使用new方法進行例項化的類,即沒有具體例項物件的類。抽象類有點類似 模板 的作用,目的是根據其格式來建立和修改新的類。物件不能由抽象類直接建立,只可以通過抽象類派生出新的子類,再由其子類來建立物件。當乙個類被宣告為抽象類時,要在這個類前面加上修飾符abstract。在抽象類中的成員方...
java抽象類和抽象方法
抽象類就是不能使用 new方法進行例項化的類,即沒有具體例項物件的類。抽象類有點類似 模板 的作用,目的是根據其格式來建立和修改新的類。物件不能由抽象類直接建立,只可以通過抽象類派生出新的子類,再由其子類來建立物件。當乙個類被宣告為抽象類時,要在這個類前面加上修飾符 abstract 在抽象類中的成...
java抽象類和抽象方法
一.抽象方法定義 使用abstract修飾且沒有方法體的方法,稱為抽象方法.特點 1.使用抽象abstract修飾,方法沒有方法體,留給子類去實現 覆蓋.2.抽象方法修飾符不能是private,final,static修飾,因為抽象方法要留給子類去實現 3.抽象方法必須定義在抽象類或者介面中.二.抽...