抽象方法和類
抽象類是一個聲明為abstract的類 — 它可能包括也可能不包括抽象方法,抽象類無法實例化,但可以進行子類化。
抽象方法是在沒有實現(xiàn)的情況下聲明的方法(沒有大括號,后跟分號),如下所示:
abstract void moveTo(double deltaX, double deltaY);
如果一個類包含抽象方法,那么該類本身必須被聲明為abstract,如:
public abstract class GraphicObject { // declare fields // declare nonabstract methods abstract void draw(); }
當抽象類被子類化時,子類通常為其父類中的所有抽象方法提供實現(xiàn),但是,如果沒有,那么子類也必須聲明為abstract。
注意:未聲明為default或static的接口(參見接口部分)中的方法是隱式抽象的,因此abstract修飾符不用于接口方法(可以使用,但不需要)。抽象類與接口相比
抽象類與接口類似,你不能實例化它們,它們可能包含有或沒有實現(xiàn)聲明的方法的組合,但是,使用抽象類,你可以聲明非靜態(tài)和final的字段,并定義public、protected和private的具體方法。使用接口,所有字段都自動為public、static和final,并且你聲明或定義的所有方法(作為默認方法)都是public,此外,你只能擴展一個類,無論它是否是抽象的,而你可以實現(xiàn)任意數(shù)量的接口。
你應(yīng)該使用哪個,抽象類或接口?
如果任何這些語句適用于你的情況,請考慮使用抽象類:
你希望在幾個密切相關(guān)的類之間共享代碼。
你希望擴展抽象類的類具有許多公共方法或字段,或者需要非公共的訪問修飾符(如protected和private)。
你想聲明非靜態(tài)或非最終字段,這使你能夠定義能夠訪問和修改它們所屬的對象的狀態(tài)的方法。
如果任何這些語句適用于你的情況,請考慮使用接口:
你希望不相關(guān)的類將實現(xiàn)你的接口,例如,Comparable和Cloneable接口由許多不相關(guān)的類實現(xiàn)。
你希望指定特定數(shù)據(jù)類型的行為,但不關(guān)心誰實現(xiàn)其行為。
你希望利用類型的多重繼承。
JDK中的抽象類的一個示例是AbstractMap,它是集合框架的一部分,它的子類(包括HashMap、TreeMap和ConcurrentHashMap)共享AbstractMap定義的許多方法(包括get、put、isEmpty、containsKey和containsValue)。
JDK中實現(xiàn)多個接口的類的一個示例是HashMap,它實現(xiàn)了Serializable、Cloneable和Map
請注意,許多軟件庫都使用抽象類和接口,HashMap類實現(xiàn)了幾個接口,并且還擴展了抽象類AbstractMap。
抽象類示例在面向?qū)ο蟮睦L圖應(yīng)用程序中,你可以繪制圓形、矩形、線條、貝塞爾曲線和許多其他圖形對象,這些對象都具有某些狀態(tài)(例如:位置、方向、線條顏色、填充顏色)和行為(例如:moveTo、rotate、resize、draw)。所有圖形對象中的一些狀態(tài)和行為都是相同的(例如:位置、填充顏色和moveTo),其他需要不同的實現(xiàn)(例如,resize或draw)。所有GraphicObjects必須能夠自己繪制或調(diào)整大小,它們只是做的方式不同,這是抽象超類的完美情況。你可以利用相似性并聲明所有圖形對象從同一個抽象父對象(例如,GraphicObject)繼承,如下圖所示。
首先,聲明一個抽象類GraphicObject,以提供所有子類完全共享的成員變量和方法,例如當前位置和moveTo方法,GraphicObject還聲明了方法的抽象方法,例如draw或resize,它們需要由所有子類實現(xiàn),但必須以不同的方式實現(xiàn),GraphicObject類看起來像這樣:
abstract class GraphicObject { int x, y; ... void moveTo(int newX, int newY) { ... } abstract void draw(); abstract void resize(); }
GraphicObject的每個非抽象子類(例如Circle和Rectangle)必須提供draw和resize方法的實現(xiàn):
class Circle extends GraphicObject { void draw() { ... } void resize() { ... } } class Rectangle extends GraphicObject { void draw() { ... } void resize() { ... } }當抽象類實現(xiàn)接口時
在接口一節(jié)中,注意到實現(xiàn)接口的類必須實現(xiàn)所有接口的方法,但是,可以定義一個不實現(xiàn)所有接口方法的類,前提是該類被聲明為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,因為它沒有完全實現(xiàn)Y,但實際上,類XX實現(xiàn)了Y。
類成員抽象類可以具有靜態(tài)字段和靜態(tài)方法,你可以像使用任何其他類一樣使用帶有類引用的靜態(tài)成員(例如,AbstractClass.staticMethod())。
上一篇:Object作為超類 下一篇:數(shù)字文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/72873.html
重寫和隱藏方法 實例方法 子類中的實例方法的簽名(名稱,加上其參數(shù)的數(shù)量和類型)和返回類型與超類中的實例方法相同,將覆蓋超類的方法。 子類覆蓋方法的能力允許類從行為足夠接近的超類繼承,然后根據(jù)需要修改行為,重寫方法與它重寫的方法具有相同的名稱、數(shù)量和參數(shù)類型,以及返回類型。重寫方法還可以返回由被重寫方法返回的類型的子類型,此子類型稱為協(xié)變返回類型。 覆蓋方法時,你可能希望使用@Override注解...
Java? 教程 Java教程是為JDK 8編寫的,本頁面中描述的示例和實踐沒有利用在后續(xù)版本中引入的改進。 Java教程是希望使用Java編程語言創(chuàng)建應(yīng)用程序的程序員的實用指南,其中包括數(shù)百個完整的工作示例和數(shù)十個課程,相關(guān)課程組被組織成教程。 覆蓋基礎(chǔ)知識的路徑 這些教程以書籍的形式提供,如Java教程,第六版,前往Amazon.com購買。 入門 介紹Java技術(shù)和安裝Java開發(fā)軟件并使用...
摘要:二面向?qū)ο蟾攀雒嫦蜻^程的設(shè)計思想和面向?qū)ο蟮脑O(shè)計思想我要吃魚香肉絲蓋飯面向過程我買菜我洗菜我切菜我放水我點火我做飯我炒菜。。。。 大家好,上次我們講過了樂字節(jié)Java編程之方法、調(diào)用、重載、遞歸,接下來我們將會進入到Java封裝的內(nèi)容。Java編程語言發(fā)展,面向?qū)ο蠛皖悺?一、編程語言的發(fā)展 機器語言——直接由計算機的指令組成,指令、數(shù)據(jù)、地址都以0和1組成:可以被計算機直接識別并執(zhí)行...
數(shù)字 本節(jié)首先討論java.lang包中的Number類,它的子類,以及使用這些類的實例化而不是原始數(shù)字類型的情況。 本節(jié)還介紹了PrintStream和DecimalFormat類,它們提供了編寫格式化數(shù)字輸出的方法。 最后,討論了java.lang中的Math類,它包含數(shù)學函數(shù),以補充語言中內(nèi)置的運算符,該類具有三角函數(shù),指數(shù)函數(shù)等方法。 數(shù)字類 使用數(shù)字時,大多數(shù)時候在代碼中使用基元類型,例...
管理源文件和類文件 Java平臺的許多實現(xiàn)依賴于分層文件系統(tǒng)來管理源文件和類文件,盡管Java語言規(guī)范不要求這樣做,策略如下。 將類、接口、枚舉或注解類型的源代碼放在文本文件中,該文件的名稱是類型的簡單名稱,其擴展名為.java,例如: //in the Rectangle.java file package graphics; public class Rectangle { ... ...
閱讀 2485·2023-04-25 21:41
閱讀 1657·2021-09-22 15:17
閱讀 1928·2021-09-22 10:02
閱讀 2443·2021-09-10 11:21
閱讀 2585·2019-08-30 15:53
閱讀 1004·2019-08-30 15:44
閱讀 957·2019-08-30 13:46
閱讀 1145·2019-08-29 18:36