原文出自 http://www.cnblogs.com/ggjucheng/archive/2012/12/05/2802733.html
英文出自 http://docs.oracle.com/javase/tutorial/java/IandI/abstract.html
抽象類別是聲明為abstract
的類——它可以或不用包含抽象方法。抽象類別不能被執行個體化,但他們可以被繼承。
抽象類別是一個聲明但沒有實現的方法(沒有大括弧,尾隨分號),例如:
abstract void moveTo(double deltaX, double deltaY);
如果一個類包含抽象方法,這個類必須聲明為abstract
,如下:
public abstract class GraphicObject { // declare fields // declare non-abstract methods abstract void draw();}
當抽象類別被繼承,子類通常要為父類的所有抽象方法提供實現。但是,如果沒有全部實現,子類也要聲明為abstract
。
注意:介面的所有方法隱式是abstract,所以abstract修飾符不用使用於介面方法(可以使用,非必須)。
抽象類別和介面
不同於介面,抽象類別可以包含不是static和final的欄位,而且他們可以包含被實現的方法。這種抽象類別類似介面,不同之處在於它們提供了部分實現,把它留給子類來完成其他實現。如果一個抽象類別僅包含抽象方法的聲明,它應該被聲明為介面。
類層次中,類可以實現多個介面,無論兩兩之間是否有聯絡。例如考慮下Comparable和
Cloneable。
通過比較,共用實現,最經常用的就是繼承抽象類別。一個抽象類別,是被一個和它有很多相似的(抽象類別的部分實現),但是有些不同(抽象方法)的子類繼承。
抽象類別例子
物件導向的繪圖應用程式中,可以畫圓形,矩形,線條,Bezier曲線,和其他很多繪圖物件。這些對象公用上都包含一定的狀態(例如:位置,方向,線條顏色,填充顏色)和行為(例如:移動,旋轉,縮放,畫)。所有繪圖物件一些狀態和行為都是相同的,例如:位置,填充顏色,和移動。其他需要不同的實現,例如,縮放或繪製。所有繪圖物件必須知道如何繪製或縮放自己,他們是不同的,他們是如何做到這一點。這是一個完美的抽象父類。您可以利用相似性,聲明的所有繪圖物件繼承自同一個抽象的父物件,例如,GraphicObject,如所示。
類矩形, 線條,貝茲路徑, 和圓形繼承GraphicObject
首先,你聲明抽象類別GraphicObject
提供成員變數和方法,這完全由所有子類共用,這像當前位置,移動方法。GraphicObject也要聲明抽象方法,如繪製或縮放,這需要給子類實現,但使用不同的方式實現。GraphicObject類看起來想這樣:
abstract class GraphicObject { int x, y; ... void moveTo(int newX, int newY) { ... } abstract void draw(); abstract void resize();}
每個GraphicObject
的非抽象子類,如Circle和Rectangle
,必須提供draw和resize方法的實現:
class Circle extends GraphicObject { void draw() { ... } void resize() { ... }}class Rectangle extends GraphicObject { void draw() { ... } void resize() { ... }}
當抽象類別實現介面
在介面的章節中,說過類實現介面時必須實現介面的全部方法。儘管如此,類如果聲明為abstract,它不需要實現介面全部的方法。例如
abstract class X implements Y { // implements all but one method of Y}class XX extends X { // implements the remaining method in Y}
這種情況下,X類必須為abstract,因為它沒有完全實現Y,而類XX則做到了全部實現Y。
類成員
抽象類別可以有static欄位和static方法。可以通過類引用訪問static成員——例如,AbstractClass.staticMethod()——就像用其他類一樣。