国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Java的接口和抽象類深入理解

Java的接口和抽象類深入理解

2021-01-05 11:13CSDN Java教程

這篇文章主要介紹了Java的接口和抽象類深入理解的相關資料,希望通過本文大家能夠理解應用接口與抽象類的使用方法,需要的朋友可以參考下

Java接口抽象類深入理解

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

一.抽象類

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

?
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
21
22
interface Alram {
  void alarm();
}
 
abstract class Door {
  void open();
  void close();
}
/**
 * Java學習交流QQ群:589809992 我們一起學Java!
 */
class AlarmDoor extends Door implements Alarm {
  void oepn() {
   //....
  }
  void close() {
   //....
  }
  void alarm() {
   //....
  }
}

如有疑問請留言或者到本站社區交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

原文鏈接:http://geek.csdn.net/news/detail/237074

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 一级欧美日韩 | 日本免费一区二区三区四区 | 五月天一区二区 | 久久久久国产一区二区三区 | 欧美午夜一区二区三区免费大片 | 国产伦精品一区二区三区四区视频 | 亚洲性视频 | 精品少妇一区二区三区日产乱码 | 午夜精品久久久久久久 | 一本一道久久久a久久久精品91 | 曰韩中文字幕 | 久久中文在线观看 | 99久久综合精品五月天 | 国产二区视频 | 亚洲精品毛片一区二区 | 中文字幕在线日韩 | 色噜噜狠狠狠综合曰曰曰 | 一区二区不卡 | 久久亚洲一区二区三区明星换脸 | 日韩电影网站 | 亚洲视频中文字幕 | 成人在线一区二区三区 | 精品久久久久久久中文字幕 | 国产精品久久久久久久午夜片 | 91视频网 | 性色av一区二区三区 | 国产成人精品一区二区在线 | 91精品国产综合久久久久久 | 久久久精品免费视频 | 男女视频在线 | 伊人热久久婷婷 | 久热中文 | 亚洲视频在线观看中文字幕 | 亚洲一二三 | 成人午夜免费视频 | 欧美精品1区2区3区 欧洲一区在线 | 日日日日干干干干 | 黄色成人在线视频 | 欧美成人影院 | 毛片网站免费在线观看 | 亚洲欧美日韩在线 |