真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Java抽象類和接口,看這一篇就夠了-創(chuàng)新互聯(lián)

本篇來談談 Java 的抽象類和接口。

成都創(chuàng)新互聯(lián)公司堅信:善待客戶,將會成為終身客戶。我們能堅持多年,是因為我們一直可值得信賴。我們從不忽悠初訪客戶,我們用心做好本職工作,不忘初心,方得始終。10多年網(wǎng)站建設經(jīng)驗成都創(chuàng)新互聯(lián)公司是成都老牌網(wǎng)站營銷服務商,為您提供做網(wǎng)站、成都做網(wǎng)站、網(wǎng)站設計、H5場景定制、網(wǎng)站制作、品牌網(wǎng)站建設、小程序定制開發(fā)服務,給眾多知名企業(yè)提供過好品質(zhì)的建站服務。

曹操在《短歌行》中為杜康酒打過一個價值一億個億的廣告——“何以解憂,唯有杜康”,我替曹操感到惋惜的是他本人并不會收到這筆不菲的代言費。想一想,要是三國時期的明星人物們有這個代言意識的話,保證各家的軍費收入會多出來一個重量級的來源。

不過,酒真的能解憂嗎?我不大敢相信。李白就曾質(zhì)疑過:“舉杯消愁愁更愁,抽刀斷水水更流?!蔽液屠畎壮窒嗤挠^點,酒啊,真的不容易解憂,但絕對可以增加作者莫名的寫作沖動。

我在寫本篇之前就小酌了一杯,一不小心激發(fā)了我強烈的創(chuàng)作欲望。不過我要奉勸各位,寒冬之際,如果遇到煩心事,千萬別肆意地追求一醉方休,萬事要懂得適可而止。

01、 抽象類

一種比較蒼白的說法是:在 Java 中,通過關鍵字abstract定義的類叫做抽象類。Java 是一門面向對象的語言,因此所有的對象都是通過類來描述的;但反過來,并不是所有的類都是用來描述對象的,抽象類就是其中的一種。

以下示例展示了一個簡單的抽象類:

//?個人認為,一名教練必須攻守兼?zhèn)?br />abstract?class?Coach?{
public?abstract?void?defend();

public?abstract?void?attack();
}

在一個抽象類中,至少有一個抽象方法(通過關鍵字abstract定義的方法,并且沒有方法體,如上例中的defend()方法和attack()方法),否則就沒有必要稱之為抽象類。需要注意的是,抽象類是不能實例化的!它需要被一個子類繼承,就像以下示例那樣。

abstract?class?Coach?{
public?abstract?void?defend();

public?abstract?void?attack();
}

class?Hesai?extends?Coach?{

@Override
public?void?defend()?{
System.out.println("防守贏得冠軍");
}

@Override
public?void?attack()?{
System.out.println("控球是把雙刃劍");
}
}

public?class?Demo?{
public?static?void?main(String[]?args)?{
Coach?moliniao?=?new?Hesai();
moliniao.defend();
moliniao.attack();
}
}

我們都知道,一個好的教練,必須攻守兼?zhèn)?,但每個教練的進攻理念和防守理念不盡相同。因此,我在教練這個抽象類(Coach)中定義兩個抽象方法,一個進攻(attack)一個防守(defend),這兩個方法的具體實現(xiàn)都要由抽象類的子類確定,抽象類本身并不負責。

我們也都知道,何塞·穆里尼奧是足球界的頂級教練。他是我最愛的足球教練,沒有之一。盡管他在曼聯(lián)的失敗有他自身的原因,但我依然崇拜他,因為:“請不要說我傲慢,因為我只是實話實說,我是歐洲冠軍,因此我并非籍籍無名,而是特殊的一個!”他是固執(zhí)的反控球主義者,堅信控球是把雙刃劍,防守贏得冠軍。

好了,對于抽象類我們簡單總結一下:

1、抽象類不能被實例化。
2、抽象類應該至少有一個抽象方法,否則它沒有任何意義。
3、抽象類中的抽象方法沒有方法體。
4、抽象類的子類必須給出父類中的抽象方法的具體實現(xiàn),除非該子類也是抽象類。

02、 接口

我們知道,有抽象方法的類被稱為抽象類,也就意味著抽象類中還能有不是抽象方法的方法。這樣的類就不能算作純粹的接口,盡管它也可以提供接口的功能——只能說抽象類是普通類與接口之間的一種中庸之道。

接口(英文:Interface),在 Java 中是一個抽象類型,是抽象方法的集合;接口通過關鍵字interface來定義。接口與抽象類的不同之處在于:

1、抽象類可以有方法體的方法,但接口沒有。
2、接口中的成員變量隱式為static final,但抽象類不是的。
3、一個類可以實現(xiàn)多個接口,但只能繼承一個抽象類。

以下示例展示了一個簡單的接口:

//?隱式的abstract
interface?Coach?{
//?隱式的public
void?defend();
void?attack();
}

接口是隱式抽象的,所以聲明時沒有必要使用abstract關鍵字;接口的每個方法都是隱式抽象的,所以同樣不需要使用abstract關鍵字;接口中的方法都是隱式public的。

和抽象類一樣,接口也不能直接被實例化,它需要一個類來實現(xiàn)它,就像以下示例展示那樣。

class?Hesai?implements?Coach?{

@Override
public?void?defend()?{
System.out.println("防守贏得冠軍");
}

@Override
public?void?attack()?{
System.out.println("控球是把雙刃劍");
}
}

public?class?Demo2?{
public?static?void?main(String[]?args)?{
Coach?moliniao?=?new?Hesai();
moliniao.defend();
moliniao.attack();
}
}

實現(xiàn)一個接口需要用到關鍵字implements,它表示:“我這個類遵從了接口的協(xié)議,如果你想使用我,看接口就行了,具體實現(xiàn)不用關心。”

03、 實現(xiàn)多個接口

在現(xiàn)實生活中,何塞·穆里尼奧不止是一名足球教練,他還是一個值得被尊重的英雄——憑借自身的努力,他從一名籍籍無名的跟班翻譯,逐漸蛻變?yōu)橐幻矣鲬魰缘捻敿壗叹殹?/p>

如果要在程序的世界里體現(xiàn)何塞·穆里尼奧的多重角色,就可以使用接口,就像以下示例展示那樣。

package?com.cmower.java_demo.nine.inf;

interface?Coach?{
//?隱式的public
void?defend();
void?attack();
}

interface?Hero?{
void?fight();
}

class?Hesai?implements?Coach,?Hero?{

@Override
public?void?defend()?{
System.out.println("防守贏得冠軍");
}

@Override
public?void?attack()?{
System.out.println("控球是把雙刃劍");
}

@Override
public?void?fight()?{
System.out.println("只要一息尚存,就應該戰(zhàn)斗到最后");
}
}

public?class?Demo2?{
public?static?void?defend(Coach?coach)?{
coach.defend();
}

public?static?void?fight(Hero?hero)?{
hero.fight();
}

public?static?void?main(String[]?args)?{
Hesai?moliniao?=?new?Hesai();
defend(moliniao);
fight(moliniao);
}
}

可以看到,創(chuàng)建的 Hesai 對象可以向上轉型為 Coach 和 Hero,然后調(diào)用各自接口中實現(xiàn)的具體方法,因為 Hesai 這個類同時實現(xiàn)了兩個接口,分別是 Coach 和 Hero(class Hesai implements Coach, Hero,接口之間通過英文逗號隔開)。

04、 接口在應用中常見的三種模式

在編程領域,好的設計模式能夠讓我們的代碼事半功倍。在使用接口的時候,經(jīng)常會用到三種模式,分別是策略模式、適配器模式和工廠模式。

1)策略模式

策略模式的思想是,針對一組算法,將每一種算法封裝到具有共同接口的實現(xiàn)類中,接口的設計者可以在不影響調(diào)用者的情況下對算法做出改變。示例如下:

//?接口:教練
interface?Coach?{
//?方法:防守
void?defend();
}

//?何塞·穆里尼奧
class?Hesai?implements?Coach?{

@Override
public?void?defend()?{
System.out.println("防守贏得冠軍");
}
}

//?德普·瓜迪奧拉
class?Guatu?implements?Coach?{

@Override
public?void?defend()?{
System.out.println("進攻就是最好的防守");
}
}

public?class?Demo?{
//?參數(shù)為接口
public?static?void?defend(Coach?coach)?{
coach.defend();
}

public?static?void?main(String[]?args)?{
//?為同一個方法傳遞不同的對象
defend(new?Hesai());
defend(new?Guatu());
}
}

Demo.defend()方法可以接受不同風格的 Coach,并根據(jù)所傳遞的參數(shù)對象的不同而產(chǎn)生不同的行為,這被稱為“策略模式”。

2)適配器模式

適配器模式的思想是,針對調(diào)用者的需求對原有的接口進行轉接。生活當中最常見的適配器就是HDMI(英語:High Definition Multimedia Interface,中文:高清多媒體接口)線,可以同時發(fā)送音頻和視頻信號。適配器模式的示例如下:

interface?Coach?{
void?defend();
void?attack();
}

//?抽象類實現(xiàn)接口,并置空方法
abstract?class?AdapterCoach?implements?Coach?{
public?void?defend()?{};
public?void?attack()?{};
}

//?新類繼承適配器
class?Hesai?extends?AdapterCoach?{
public?void?defend()?{
System.out.println("防守贏得冠軍");
}
}

public?class?Demo?{
public?static?void?main(String[]?args)?{
Coach?coach?=?new?Hesai();
coach.defend();
}
}

Coach 接口中定義了兩個方法(defend()attack()),如果類直接實現(xiàn)該接口的話,就需要對兩個方法進行實現(xiàn)。

如果我們只需要對其中一個方法進行實現(xiàn)的話,就可以使用一個抽象類作為中間件,即適配器(AdapterCoach),用這個抽象類實現(xiàn)接口,并對抽象類中的方法置空(方法體只有一對花括號),這時候,新類就可以繞過接口,繼承抽象類,我們就可以只對需要的方法進行覆蓋,而不是接口中的所有方法。

3)工廠模式

所謂的工廠模式理解起來也不難,就是什么工廠生產(chǎn)什么,比如說寶馬工廠生產(chǎn)寶馬,奔馳工廠生產(chǎn)奔馳,A 級學院畢業(yè) A 級教練,C 級學院畢業(yè) C 級教練。示例如下:

//?教練
interface?Coach?{
void?command();
}

//?教練學院
interface?CoachFactory?{
Coach?createCoach();
}

//?A級教練
class?ACoach?implements?Coach?{

@Override
public?void?command()?{
System.out.println("我是A級證書教練");
}

}

//?A級教練學院
class?ACoachFactory?implements?CoachFactory?{

@Override
public?Coach?createCoach()?{
return?new?ACoach();
}

}

//?C級教練
class?CCoach?implements?Coach?{

@Override
public?void?command()?{
System.out.println("我是C級證書教練");
}

}

//?C級教練學院
class?CCoachFactory?implements?CoachFactory?{

@Override
public?Coach?createCoach()?{
return?new?CCoach();
}

}

public?class?Demo?{
public?static?void?create(CoachFactory?factory)?{
factory.createCoach().command();
}

public?static?void?main(String[]?args)?{
//?對于一支球隊來說,需要什么樣的教練就去找什么樣的學院
//?學院會介紹球隊對應水平的教練。
create(new?ACoachFactory());
create(new?CCoachFactory());
}
}

有兩個接口,一個是 Coach(教練),可以command()(指揮球隊);另外一個是 CoachFactory(教練學院),能createCoach()(教出一名優(yōu)秀的教練)。然后 ACoach 類實現(xiàn) Coach 接口,ACoachFactory 類實現(xiàn) CoachFactory 接口;CCoach 類實現(xiàn) Coach 接口,CCoachFactory 類實現(xiàn) CoachFactory 接口。當需要 A 級教練時,就去找 A 級教練學院;當需要 C 級教練時,就去找 C 級教練學院。

依次類推,我們還可以用 BCoach 類實現(xiàn) Coach 接口,BCoachFactory 類實現(xiàn) CoachFactory 接口,從而不斷地豐富教練的梯隊。

05、 總結

盡管接口使得抽象更進一步,但任何抽象性都應該根據(jù)真正的需求而產(chǎn)生,因此恰當?shù)脑瓌t是優(yōu)先選擇類而不是接口,只有在真正需要接口的時候再重構代碼。


上一篇:Java:多態(tài)乃幸福本源

下一篇:Java內(nèi)部類真的那么難以理解?

微信搜索「沉默王二」公眾號,關注后回復「免費視頻」獲取 500G Java 高質(zhì)量教學視頻(已分門別類)。

創(chuàng)新互聯(lián)www.cdcxhl.cn,專業(yè)提供香港、美國云服務器,動態(tài)BGP最優(yōu)骨干路由自動選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡助力業(yè)務部署。公司持有工信部辦法的idc、isp許可證, 機房獨有T級流量清洗系統(tǒng)配攻擊溯源,準確進行流量調(diào)度,確保服務器高可用性。佳節(jié)活動現(xiàn)已開啟,新人活動云服務器買多久送多久。


新聞名稱:Java抽象類和接口,看這一篇就夠了-創(chuàng)新互聯(lián)
網(wǎng)站鏈接:http://weahome.cn/article/iggjd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部