java樂器(java 中 抽象 封裝 怎麽理解?

董乐器 2022-05-27 12:39:20

1)接口中不能有非抽象方法,但抽象類中可以有java樂器。

2)一個類能實現多個接口,但只能有一個父類。

3)接口並不屬于繼承結構,它實際與繼承無關,因此無關的類也可以實現同一個接口。

抽象類和方法

在我們所有樂器(Instrument)例子中,基礎類Instrument內的方法都肯定是“僞”方法。若去調用這些方法,就會出現錯誤。那是由于Instrument的意圖是爲從它衍生出去的所有類都創建一個通用接口。

之所以要建立這個通用接口,唯一的原因就是它能爲不同的子類型作出不同的表示。它爲我們建立了一種基本形式,使我們能定義在所有衍生類裏“通用”的一些東西。爲闡述這個觀念,另一個方法是把Instrument稱爲“抽象基礎類”(簡稱“抽象類”)。若想通過該通用接口處理一系列類,就需要創建一個抽象類。對所有與基礎類聲明的簽名相符的衍生類方法,都可以通過動態綁定機制進行調用(然而,正如上一節指出的那樣,如果方法名與基礎類相同,但自變量或參數不同,就會出現過載現象,那或許並非我們所願意的)。

如果有一個象Instrument那樣的抽象類,那個類的對象幾乎肯定沒有什麽意義。換言之,Instrument的作用僅僅是表達接口,而不是表達一些具體的實施細節。所以創建一個Instrument對象是沒有意義的,而且我們通常都應禁止用戶那樣做。爲達到這個目的,可令Instrument內的所有方法都顯示出錯消息。但這樣做會延遲信息到運行期,並要求在用戶那一面進行徹底、可靠的測試。無論如何,最好的方法都是在編譯期間捕捉到問題。

針對這個問題,Java專門提供了一種機制,名爲“抽象方法”。它屬于一種不完整的方法,只含有一個聲明,沒有方法主體。下面是抽象方法聲明時采用的語法:

abstract void X();

包含了抽象方法的一個類叫作“抽象類”。如果一個類裏包含了一個或多個抽象方法,類就必須指定成abstract(抽象)。否則,編譯器會向我們報告一條出錯消息。

若一個抽象類是不完整的,那麽一旦有人試圖生成那個類的一個對象,編譯器又會采取什麽行動呢?由于不能安全地爲一個抽象類創建屬于它的對象,所以會從編譯器那裏獲得一條出錯提示。通過這種方法,編譯器可保證抽象類的“純潔性”,我們不必擔心會誤用它。

如果從一個抽象類繼承,而且想生成新類型的一個對象,就必須爲基礎類中的所有抽象方法提供方法定義。如果不這樣做(完全可以選擇不做),則衍生類也會是抽象的,而且編譯器會強迫我們用abstract關鍵字標志那個類的“抽象”本質。

即使不包括任何abstract方法,亦可將一個類聲明成“抽象類”。如果一個類沒必要擁有任何抽象方法,而且我們想禁止那個類的所有實例,這種能力就會顯得非常有用。

接口

“interface”(接口)關鍵字使抽象的概念更深入了一層。我們可將其想象爲一個“純”抽象類。它允許創建者規定一個類的基本形式:方法名、自變量列表以及返回類型,但不規定方法主體。接口也包含了基本數據類型的數據成員,但它們都默認爲static和final。接口只提供一種形式,並不提供實施的細節。

接口這樣描述自己:“對于實現我的所有類,看起來都應該象我現在這個樣子”。因此,采用了一個特定接口的所有代碼都知道對于那個接口可能會調用什麽方法。這便是接口的全部含義。所以我們常把接口用于建立類和類之間的一個“協議”。有些面向對象的程序設計語言采用了一個名爲“protocol”(協議)的關鍵字,它做的便是與接口相同的事情。

爲創建一個接口,請使用interface關鍵字,而不要用class。與類相似,我們可在interface關鍵字的前面增加一個public關鍵字(但只有接口定義于同名的一個文件內);或者將其省略,營造一種“友好的”狀態。

爲了生成與一個特定的接口(或一組接口)相符的類,要使用implements(實現)關鍵字。我們要表達的意思是“接口看起來就象那個樣子,這兒是它具體的工作細節”。除這些之外,我們其他的工作都與繼承極爲相似

通俗一點說,抽象就是 有辦法又沒有辦法(可以有構造函數)。接口就是一點辦法都沒有(注意包括不能有構造函數),全等著別人給它完成。所以,你發現沒,實現抽象類,用extends,實現接口卻不是用繼承,而是implemens。其實,我認爲,他們倆都是類,但是一個抽象地徹底(接口),一個不夠徹底(抽象類),所以,實質上的“繼承”用不同的關鍵字表示。

上一篇:用樂器演繹(用樂器演繹心經 )
下一篇:
相关文章
留言与评论 (共有 条评论)
验证码:
顶部