日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

深入理解Java中的抽象类和接口

發布時間:2025/3/20 java 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深入理解Java中的抽象类和接口 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

對于面向對象編程來說,抽象是它的一大特征之一。在Java中,可以通過兩種形式來體現OOP的抽象:接口和抽象類。這兩者有太多相似的地方,又有太多不同的地方。很多人在初學的時候會以為它們可以隨意互換使用,但是實際則不然。今天我們就一起來學習一下Java中的接口和抽象類。下面是本文的目錄大綱:

  一.抽象類

  二.接口

  三.抽象類和接口的區別

  若有不正之處,請多多諒解并歡迎批評指正,不甚感激。

  請尊重作者勞動成果,轉載請標明原文鏈接:

  http://www.cnblogs.com/dolphin0520/p/3811437.html

一.抽象類

  在了解抽象類之前,先來了解一下抽象方法。抽象方法是一種特殊的方法:它只有聲明,而沒有具體的實現。抽象方法的聲明格式為:

1

abstract?void?fun();

  抽象方法必須用abstract關鍵字進行修飾。如果一個類含有抽象方法,則稱這個類為抽象類,抽象類必須在類前用abstract關鍵字修飾。因為抽象類中含有無具體實現的方法,所以不能用抽象類創建對象。

  下面要注意一個問題:在《JAVA編程思想》一書中,將抽象類定義為“包含抽象方法的類”,但是后面發現如果一個類不包含抽象方法,只是用abstract修飾的話也是抽象類。也就是說抽象類不一定必須含有抽象方法。個人覺得這個屬于鉆牛角尖的問題吧,因為如果一個抽象類不包含任何抽象方法,為何還要設計為抽象類?所以暫且記住這個概念吧,不必去深究為什么。

1

2

3

[public]?abstract?class?ClassName {

????abstract?void?fun();

}

  從這里可以看出,抽象類就是為了繼承而存在的,如果你定義了一個抽象類,卻不去繼承它,那么等于白白創建了這個抽象類,因為你不能用它來做任何事情。對于一個父類,如果它的某個方法在父類中實現出來沒有任何意義,必須根據子類的實際需求來進行不同的實現,那么就可以將這個方法聲明為abstract方法,此時這個類也就成為abstract類了。

  包含抽象方法的類稱為抽象類,但并不意味著抽象類中只能有抽象方法,它和普通類一樣,同樣可以擁有成員變量和普通的成員方法。注意,抽象類和普通類的主要有三點區別:

  1)抽象方法必須為public或者protected(因為如果為private,則不能被子類繼承,子類便無法實現該方法),缺省情況下默認為public。

  2)抽象類不能用來創建對象;

  3)如果一個類繼承于一個抽象類,則子類必須實現父類的抽象方法。如果子類沒有實現父類的抽象方法,則必須將子類也定義為為abstract類。

  在其他方面,抽象類和普通的類并沒有區別。

二.接口

  接口,英文稱作interface,在軟件工程中,接口泛指供別人調用的方法或者函數。從這里,我們可以體會到Java語言設計者的初衷,它是對行為的抽象。在Java中,定一個接口的形式如下:

1

2

3

[public]?interface?InterfaceName {

?

}

  接口中可以含有 變量和方法。但是要注意,接口中的變量會被隱式地指定為public static final變量(并且只能是public static final變量,用private修飾會報編譯錯誤),而方法會被隱式地指定為public abstract方法且只能是public abstract方法(用其他關鍵字,比如private、protected、static、 final等修飾會報編譯錯誤),并且接口中所有的方法不能有具體的實現,也就是說,接口中的方法必須都是抽象方法。從這里可以隱約看出接口和抽象類的區別,接口是一種極度抽象的類型,它比抽象類更加“抽象”,并且一般情況下不在接口中定義變量。

  要讓一個類遵循某組特地的接口需要使用implements關鍵字,具體格式如下:

1

2

class?ClassName?implements?Interface1,Interface2,[....]{

}

  可以看出,允許一個類遵循多個特定的接口。如果一個非抽象類遵循了某個接口,就必須實現該接口中的所有方法。對于遵循某個接口的抽象類,可以不實現該接口中的抽象方法。

三.抽象類和接口的區別

1.語法層面上的區別

  1)抽象類可以提供成員方法的實現細節,而接口中只能存在public abstract 方法;

  2)抽象類中的成員變量可以是各種類型的,而接口中的成員變量只能是public static final類型的;

  3)接口中不能含有靜態代碼塊以及靜態方法,而抽象類可以有靜態代碼塊和靜態方法;

  4)一個類只能繼承一個抽象類,而一個類卻可以實現多個接口。

2.設計層面上的區別

  1)抽象類是對一種事物的抽象,即對類抽象,而接口是對行為的抽象。抽象類是對整個類整體進行抽象,包括屬性、行為,但是接口卻是對類局部(行為)進行抽象。舉個簡單的例子,飛機和鳥是不同類的事物,但是它們都有一個共性,就是都會飛。那么在設計的時候,可以將飛機設計為一個類Airplane,將鳥設計為一個類Bird,但是不能將飛行 這個特性也設計為類,因此它只是一個行為特性,并不是對一類事物的抽象描述。此時可以將 飛行 設計為一個接口Fly,包含方法fly( ),然后Airplane和Bird分別根據自己的需要實現Fly這個接口。然后至于有不同種類的飛機,比如戰斗機、民用飛機等直接繼承Airplane即可,對于鳥也是類似的,不同種類的鳥直接繼承Bird類即可。從這里可以看出,繼承是一個 "是不是"的關系,而 接口 實現則是 "有沒有"的關系。如果一個類繼承了某個抽象類,則子類必定是抽象類的種類,而接口實現則是有沒有、具備不具備的關系,比如鳥是否能飛(或者是否具備飛行這個特點),能飛行則可以實現這個接口,不能飛行就不實現這個接口。

  2)設計層面不同,抽象類作為很多子類的父類,它是一種模板式設計。而接口是一種行為規范,它是一種輻射式設計。什么是模板式設計?最簡單例子,大家都用過ppt里面的模板,如果用模板A設計了ppt B和ppt C,ppt B和ppt C公共的部分就是模板A了,如果它們的公共部分需要改動,則只需要改動模板A就可以了,不需要重新對ppt B和ppt C進行改動。而輻射式設計,比如某個電梯都裝了某種報警器,一旦要更新報警器,就必須全部更新。也就是說對于抽象類,如果需要添加新的方法,可以直接在抽象類中添加具體的實現,子類可以不進行變更;而對于接口則不行,如果接口進行了變更,則所有實現這個接口的類都必須進行相應的改動。

  下面看一個網上流傳最廣泛的例子:門和警報的例子:門都有open( )和close( )兩個動作,此時我們可以定義通過抽象類和接口來定義這個抽象概念:

1

2

3

4

abstract?class?Door {

????public?abstract?void?open();

????public?abstract?void?close();

}

  或者:

1

2

3

4

interface?Door {

????public?abstract?void?open();

????public?abstract?void?close();

}

  但是現在如果我們需要門具有報警alarm( )的功能,那么該如何實現?下面提供兩種思路:

  1)將這三個功能都放在抽象類里面,但是這樣一來所有繼承于這個抽象類的子類都具備了報警功能,但是有的門并不一定具備報警功能;

  2)將這三個功能都放在接口里面,需要用到報警功能的類就需要實現這個接口中的open( )和close( ),也許這個類根本就不具備open( )和close( )這兩個功能,比如火災報警器。

  從這里可以看出,?Door的open() 、close()和alarm()根本就屬于兩個不同范疇內的行為,open()和close()屬于門本身固有的行為特性,而alarm()屬于延伸的附加行為。因此最好的解決辦法是單獨將報警設計為一個接口,包含alarm()行為,Door設計為單獨的一個抽象類,包含open和close兩種行為。再設計一個報警門繼承Door類和實現Alarm接口。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

interface?Alram {

????void?alarm();

}

?

abstract?class?Door {

????void?open();

????void?close();

}

?

class?AlarmDoor?extends?Door?implements?Alarm {

????void?oepn() {

??????//....

????}

????void?close() {

??????//....

????}

????void?alarm() {

??????//....

????}

}


轉載于:https://blog.51cto.com/zziajie/1943567

總結

以上是生活随笔為你收集整理的深入理解Java中的抽象类和接口的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日本特黄特色aaa大片免费 | 亚洲色在线视频 | 91日日| 日韩黄色一级大片 | 欧美级毛片 | 在线观看日韩欧美 | 亚洲精品123区 | 天天操天天干视频 | 波多野结衣在线网址 | 337p日本大胆噜噜噜噜 | 国产在线精品福利 | 免费一区二区三区四区 | 国产精品久久国产 | va免费视频 | 蜜桃av在线看 | 国产精久久久久 | 在线视频网站 | 国产三级一区二区三区 | xxxx国产| 激情欧美一区二区 | 男女涩涩网站 | 国产精品视频免费观看 | 性猛交ⅹxxx富婆视频 | 黄色片视频免费 | 亚洲激情成人 | 91精品免费视频 | 国产成人无码一区二区在线观看 | 久久久久成人网站 | 99热久久这里只有精品 | 青春草在线视频观看 | 成人综合婷婷国产精品久久 | 91精品91久久久中77777 | 欧美青草视频 | 成人在线午夜 | 黑料视频在线观看 | 最新日韩视频 | 四虎免费av | 女人av| 麻豆传媒映画官网 | 四虎影院免费视频 | 免费看黄色一级大片 | 中文字幕无码av波多野吉衣 | 蜜桃臀aⅴ精品一区二区三区 | 日本人dh亚洲人ⅹxx | 久久精品在线播放 | 免费精品在线观看 | 欧美一级在线看 | 色片免费看 | 黄色一级免费看 | 亚洲国产一区二区三区a毛片 | 成人黄色电影网址 | 色哟哟日韩精品 | 日韩电影一区 | 奇米网888| 国产成人亚洲欧洲在线 | 视频污在线观看 | 不卡一区在线观看 | 精品人妻在线视频 | 美女张开腿让男人操 | 午夜在线观看免费视频 | 一级a性色生活片久久无 | √天堂资源在线 | 色哟哟av| 久久亚洲精品无码va白人极品 | 国产一级高清 | 午夜视频91 | 黄色aa视频 | 国产孕妇一区二区三区 | 免费在线观看高清影视网站 | 国产偷人 | 手机看片国产精品 | 欧美性白人极品1819hd | 乱熟女高潮一区二区在线 | a级片免费播放 | 不卡的av网站 | 亚洲午夜精品久久久久久app | 欧美浓毛大泬视频 | 日韩欧美视频免费在线观看 | 欧美人与性禽动交精品 | 成人a在线观看 | 国产a v一区二区三区 | 制服.丝袜.亚洲.中文.综合 | 9i精品福利一区二区三区 | 亚洲欧洲免费无码 | 久久av秘一区二区三区 | 亚洲一区二区三区在线视频 | www.国产91| 国产妇女馒头高清泬20p多 | 91视频麻豆 | 狼人精品一区二区三区在线 | 国产精品久久久久国产a级 国产一区二区在线播放 | 黑人极品videos精品欧美裸 | 最新福利视频 | 国产伦精品一区二区三区高清 | 亚洲天堂中文字幕在线 | 人妻视频一区 | 黄色高清视频在线观看 | 深爱五月激情网 | 亚洲 日本 欧美 中文幕 |