Java 中的抽象與接口

抽象方法和抽象類(abstract)

  1. 抽象方法和抽象類使用 abstract 來定義哑子,有抽象方法的類必須被定義為抽象類,抽象類里可以沒有抽象方法奉芦;
  2. 抽象方法:只有方法簽名赵抢,沒有方法體的方法;
  3. 抽象類不能被實(shí)例化声功,也就是不能通過new關(guān)鍵字去產(chǎn)生對(duì)象烦却,只能被繼承,但是可以定義變量先巴,任何繼承了抽象類的非抽象類的對(duì)象可以給這個(gè)變量賦值其爵;
  4. 抽象類的子類必須實(shí)現(xiàn)抽象類里的所有抽象方法,否則這個(gè)子類還是抽象類伸蚯;
  5. 抽象類可以包含成員變量摩渺、方法(普通方法和抽象方法)、構(gòu)造器(并不用于創(chuàng)建對(duì)象剂邮,而是讓子類調(diào)用摇幻,從而完成屬于抽象類的初始化操作)、初始化塊挥萌、內(nèi)部類(接口绰姻、枚舉)。

抽象類的作用

抽象類是從多個(gè)具有相同特征的具體類中抽象出來的父類引瀑,以這個(gè)父類作為子類的模板狂芋,可以避免子類設(shè)計(jì)的隨意性。

模板方法模式(Template Method)

1. 模板方法模式是由抽象父類控制頂級(jí)邏輯憨栽,并把某些操作的實(shí)現(xiàn)推遲到子類去實(shí)現(xiàn)帜矾。 
2. 如果編寫一個(gè)抽象父類翼虫,父類將部分邏輯以具體方法以及具體構(gòu)造函數(shù)的形式實(shí)現(xiàn),并把不能實(shí)現(xiàn)的部分抽成抽象方法屡萤,留給其子類去實(shí)現(xiàn)珍剑,不同的子類可以以不同的方式實(shí)現(xiàn)這些抽象方法,從而對(duì)剩余的邏輯有不同的實(shí)現(xiàn)灭衷,這種模式就叫模板方法模式次慢。

具體例子:

SpeedMeter - class

上面定義了一個(gè)抽象的SpeedMeter類,用來計(jì)算車速翔曲。該類定義了兩個(gè)子類通用的方法——設(shè)置轉(zhuǎn)速的方法setTurnRate()和計(jì)算車速的方法getSpeed(),getSpeed()方法需要知道車輪的半徑劈愚,但SpeedMeter并不知道車輪的半徑瞳遍,所以將其抽象成抽象方法,交由子類來實(shí)現(xiàn)菌羽。

CarSpeedMeter - class
BicycleSpeedMeter - class

上面定義了CarSpeedMeter類和BicycleSpeedMeter類掠械,它們均繼承自SpeedMeter類,并實(shí)現(xiàn)了其父類中的抽象方法getRadius()注祖,其中CarSpeedMeter類的半徑是0.31m猾蒂,BicycleSpeedMeter類的半徑是0.33m。

Test - class

上面定義了一個(gè)測(cè)試類是晨,分別創(chuàng)建了CarSpeedMeter類和BicycleSpeedMeter類的對(duì)象肚菠,并分別設(shè)置它們的轉(zhuǎn)速,最后打印它們各自的車速罩缴。

運(yùn)行結(jié)果:

Result

模板方法模式(Template Method)的應(yīng)用場(chǎng)景

  • 具有統(tǒng)一的操作步驟或操作過程
  • 具有不同的操作細(xì)節(jié)
  • 存在多個(gè)具有同樣操作步驟的應(yīng)用場(chǎng)景蚊逢,但某些具體的操作細(xì)節(jié)卻各不相同

接口(interface)

  1. 接口里可以包含成員變量、方法箫章、內(nèi)部類(包括內(nèi)部接口和枚舉)烙荷,不能有構(gòu)造器和初始化塊;
  2. 接口里的成員變量必須初始化(即必須賦初值)檬寂,且均為靜態(tài)常量(即此值一旦賦值便不能再更改终抽,系統(tǒng)會(huì)自動(dòng)為成員變量添加static和final修飾符,故可以省略)桶至;
  3. 接口里的方法只能為抽象方法(沒有方法體)昼伴、類方法(必須使用static修飾,有方法體塞茅,Java 8及以上版本支持)亩码、默認(rèn)方法(必須使用default修飾,有方法體野瘦,Java 8及以上版本支持)描沟;
  4. 一個(gè)接口可以從多個(gè)接口得到繼承(即接口允許多繼承飒泻,類只能單繼承),但不允許接口從類得到繼承(即接口只能繼承接口)吏廉;
  5. 接口不能被實(shí)例化泞遗。

接口的語法格式

[修飾符] interface 接口名 { 定義零到多個(gè)常量... 定義零到多個(gè)抽象方法... 定義零到多個(gè)內(nèi)部類、接口席覆、枚舉... 定義零到多個(gè)默認(rèn)方法史辙、類方法(Java 8+)... }
??修飾符可以是public或者省略,省略的話默認(rèn)為default(即包權(quán)限)佩伤。

接口的用途

  • 定義變量聊倔,也可以用于進(jìn)行強(qiáng)制類型轉(zhuǎn)換
  • 調(diào)用接口中定義的常量
  • 被其它類實(shí)現(xiàn)

實(shí)現(xiàn)接口

1. 一個(gè)類只能繼承一個(gè)類,但可以實(shí)現(xiàn)(implements)一個(gè)或多個(gè)接口(即單繼承生巡,多實(shí)現(xiàn))耙蔑;
2. 一個(gè)類實(shí)現(xiàn)接口后,必須實(shí)現(xiàn)接口里的所有抽象方法孤荣,否則這個(gè)類就成為一個(gè)抽象類甸陌。

簡(jiǎn)單工廠模式(Simple Factory Pattern)

1. 簡(jiǎn)單工廠模式,又叫靜態(tài)工廠方法(Static Factory Method)模式盐股;
2. 簡(jiǎn)單工廠模式是由一個(gè)工廠對(duì)象根據(jù)傳入的參數(shù)钱豁,動(dòng)態(tài)地決定創(chuàng)建出哪一種產(chǎn)品類的實(shí)例(這產(chǎn)品類往往繼承自同一個(gè)父類或?qū)崿F(xiàn)了同一個(gè)接口)。

簡(jiǎn)單工廠模式包含的角色及職責(zé)

工廠(Creator)角色
??簡(jiǎn)單工廠模式的核心疯汁,它負(fù)責(zé)實(shí)現(xiàn)創(chuàng)建所有實(shí)例的內(nèi)部邏輯牲尺。工廠類創(chuàng)建產(chǎn)品類的方法可以被外界直接調(diào)用,創(chuàng)建所需的產(chǎn)品對(duì)象涛目。
抽象產(chǎn)品(Product)角色
??簡(jiǎn)單工廠模式所創(chuàng)建的所有對(duì)象的父類(父類可以是接口或抽象類)秸谢,它負(fù)責(zé)描述所有實(shí)例所共有的公共接口。
具體產(chǎn)品(Concrete Product)角色
??簡(jiǎn)單工廠模式所創(chuàng)建的具體實(shí)例對(duì)象霹肝。

具體例子:

Printer - interface

上面定義了一個(gè)Printer接口估蹄,在其內(nèi)部定義了三個(gè)抽象方法。

HPPrinter - class

上面定義了一個(gè)HPPrinter類沫换,其實(shí)現(xiàn)了Printer接口并重寫了Printer接口的全部抽象方法臭蚁。

CanonPrinter - class

上面定義了一個(gè)CanonPrinter 類,其實(shí)現(xiàn)了Printer接口并重寫了Printer接口的全部抽象方法讯赏。

PrinterFactory - class

上面定義了一個(gè)PrinterFactory類垮兑,其有一個(gè)返回值類型為Printer的靜態(tài)方法,根據(jù)用戶傳入的不同參數(shù)創(chuàng)建不同的實(shí)例漱挎。

Test - class

上面定義了一個(gè)測(cè)試類系枪,用來測(cè)試程序。

運(yùn)行結(jié)果:

Result 1
Result 2

從上面的運(yùn)行結(jié)果可以看到磕谅,當(dāng)用戶輸入不同的參數(shù)時(shí)私爷,會(huì)得到不同的打印機(jī)雾棺。

簡(jiǎn)單工廠模式的優(yōu)缺點(diǎn)

優(yōu)點(diǎn):
??工廠類是整個(gè)模式的關(guān)鍵所在。它包含必要的判斷邏輯衬浑,能夠根據(jù)外界給定的信息捌浩,決定究竟應(yīng)該創(chuàng)建哪個(gè)具體類的對(duì)象。用戶在使用時(shí)可以直接根據(jù)工廠類去創(chuàng)建所需的實(shí)例工秩,而無需了解這些對(duì)象是如何創(chuàng)建以及如何組織的尸饺。這有利于整個(gè)軟件體系結(jié)構(gòu)的優(yōu)化。
缺點(diǎn):
??由于工廠類集中了所有實(shí)例的創(chuàng)建邏輯助币,將全部創(chuàng)建邏輯集中到了一個(gè)工廠類中浪听,導(dǎo)致沒有很高的內(nèi)聚性;同時(shí)奠支,工廠類違反了開閉原則馋辈,它所能創(chuàng)建的類只能是事先考慮到的,如果需要添加新的類倍谜,那就需要改變工廠類了。


參考資料:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末叉抡,一起剝皮案震驚了整個(gè)濱河市尔崔,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌褥民,老刑警劉巖季春,帶你破解...
    沈念sama閱讀 212,222評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異消返,居然都是意外死亡载弄,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,455評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門撵颊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來宇攻,“玉大人,你說我怎么就攤上這事倡勇〕阉ⅲ” “怎么了?”我有些...
    開封第一講書人閱讀 157,720評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵妻熊,是天一觀的道長(zhǎng)夸浅。 經(jīng)常有香客問我,道長(zhǎng)扔役,這世上最難降的妖魔是什么帆喇? 我笑而不...
    開封第一講書人閱讀 56,568評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮亿胸,結(jié)果婚禮上坯钦,老公的妹妹穿的比我還像新娘预皇。我一直安慰自己,他們只是感情好葫笼,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,696評(píng)論 6 386
  • 文/花漫 我一把揭開白布深啤。 她就那樣靜靜地躺著,像睡著了一般路星。 火紅的嫁衣襯著肌膚如雪旭等。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,879評(píng)論 1 290
  • 那天朱浴,我揣著相機(jī)與錄音蒿讥,去河邊找鬼。 笑死友绝,一個(gè)胖子當(dāng)著我的面吹牛堤尾,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播迁客,決...
    沈念sama閱讀 39,028評(píng)論 3 409
  • 文/蒼蘭香墨 我猛地睜開眼郭宝,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了掷漱?” 一聲冷哼從身側(cè)響起粘室,我...
    開封第一講書人閱讀 37,773評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎卜范,沒想到半個(gè)月后衔统,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,220評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡海雪,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,550評(píng)論 2 327
  • 正文 我和宋清朗相戀三年锦爵,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片奥裸。...
    茶點(diǎn)故事閱讀 38,697評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡险掀,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出刺彩,到底是詐尸還是另有隱情迷郑,我是刑警寧澤,帶...
    沈念sama閱讀 34,360評(píng)論 4 332
  • 正文 年R本政府宣布创倔,位于F島的核電站嗡害,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏畦攘。R本人自食惡果不足惜霸妹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,002評(píng)論 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望知押。 院中可真熱鬧叹螟,春花似錦鹃骂、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,782評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至良价,卻和暖如春寝殴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背明垢。 一陣腳步聲響...
    開封第一講書人閱讀 32,010評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工蚣常, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人痊银。 一個(gè)月前我還...
    沈念sama閱讀 46,433評(píng)論 2 360
  • 正文 我出身青樓抵蚊,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親溯革。 傳聞我的和親對(duì)象是個(gè)殘疾皇子贞绳,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,587評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法致稀,內(nèi)部類的語法熔酷,繼承相關(guān)的語法,異常的語法豺裆,線程的語...
    子非魚_t_閱讀 31,598評(píng)論 18 399
  • 原文鏈接:http://blog.csdn.net/zhangerqing http://www.cnblogs....
    孤獨(dú)雜貨鋪閱讀 1,509評(píng)論 0 3
  • 一、設(shè)計(jì)模式的分類 總體來說設(shè)計(jì)模式分為三大類: 創(chuàng)建型模式号显,共五種:工廠方法模式臭猜、抽象工廠模式、單例模式押蚤、建造者...
    lichengjin閱讀 890評(píng)論 0 8
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理蔑歌,服務(wù)發(fā)現(xiàn),斷路器揽碘,智...
    卡卡羅2017閱讀 134,633評(píng)論 18 139
  • 文/谷穗風(fēng)致 奶奶去逝那年,我隨父親回老家奔喪掖桦。 生前本昏,奶奶一直獨(dú)居在老家圍龍屋村里的一間小泥磚單間。鄉(xiāng)下最親的人...
    谷穗風(fēng)致Echo閱讀 954評(píng)論 37 37