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

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

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

服務(wù)器之家 - 編程語言 - Java教程 - 深入淺出分析Java抽象類和接口【功能,定義,用法,區(qū)別】

深入淺出分析Java抽象類和接口【功能,定義,用法,區(qū)別】

2020-12-16 13:23fancylovejava Java教程

這篇文章主要介紹了Java抽象類和接口,結(jié)合實例形式深入淺出的分析了java抽象類與接口的功能功能,定義,用法及區(qū)別,需要的朋友可以參考下

本文實例講述了Java抽象類接口。分享給大家供大家參考,具體如下:

對于OOP編程來說,抽象是它一大特征之一。在Java中,可以通過兩種形式來體現(xiàn)OOP的抽象:抽象類和接口。

這兩者有相似之處也有很大的不同之處。

一、抽象類

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

?
1
abstract void fun();

抽象方法必須用abstract關(guān)鍵字進行修飾。如果一個類含有抽象方法,則稱這個類為抽象類,這個類就必須在類前用abstract進行修飾,否則在IDE中編譯的時候就會提示錯誤。因為抽象類中含有無具體實現(xiàn)的方法,所以不能用抽象類進行創(chuàng)建對象。

還有一個問題需要注意:一個用abstract修飾的抽象類也可以不包含抽象方法。個人覺得這個屬于鉆牛角尖的問題吧,因為如果一個抽象類不包含任何抽象方法,為何還要設(shè)計為抽象類?所以暫且記住這個概念吧,不必去深究為什么。

?
1
2
3
[public] abstract class ClassName(){
abstract void fun();
}

從這里可以看出,抽象類是為類繼承而存在的,不能用抽象類創(chuàng)建對象,也就這個抽象類不能做任何事情。對于一個父類,如果它的某個方法在父類中實現(xiàn)出來沒有任何意義,必須根據(jù)子類的實際需求進行不同的實現(xiàn),那么可以將這個方法聲明為abstract方法,這個類就是abstract抽象類。

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

1、抽象方法必須為public或者protected(因為如果為private,則不能被子類繼承,子類無法實現(xiàn)該方法),缺省情況下默認為public
2、抽象類不能用來創(chuàng)建對象
3、如果一個類繼承于一個抽象類,則子類必須實現(xiàn)父類的抽象方法。如果子類沒有實現(xiàn)父類的抽象方法,則必須將子類也定義成abstract抽象類。

其他方面抽象類和普通類并沒有什么區(qū)別。

二、接口

接口,即interface,在軟件工程中,接口泛指供別人調(diào)用的方法或者函數(shù)。從這里,我們可以體會到j(luò)ava語言設(shè)計者的初衷,它是對于行為的抽象。

java中接口的定義形式

?
1
[public] interface InterfaceName{}

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

讓一個類實現(xiàn)該接口可以用implements,格式

?
1
class ClassName implements Interface1,Interface2{}

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

比如在Android的源代碼中的Adapter類就是一個接口類

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/**
 * An Adapter object acts as a bridge between an {@link AdapterView} and the
 * underlying data for that view. The Adapter provides access to the data items.
 * The Adapter is also responsible for making a {@link android.view.View} for
 * each item in the data set.
 *
 * @see android.widget.ArrayAdapter
 * @see android.widget.CursorAdapter
 * @see android.widget.SimpleCursorAdapter
 */
public interface Adapter {
  void registerDataSetObserver(DataSetObserver observer);
  void unregisterDataSetObserver(DataSetObserver observer);
  int getCount();
  Object getItem(int position);
  long getItemId(int position);
  boolean hasStableIds();
  View getView(int position, View convertView, ViewGroup parent);
  static final int IGNORE_ITEM_VIEW_TYPE = AdapterView.ITEM_VIEW_TYPE_IGNORE;
  int getItemViewType(int position);
  int getViewTypeCount();
  static final int NO_SELECTION = Integer.MIN_VALUE;
   boolean isEmpty();
}

在這個接口里面聲明了幾個方法,且這些方法都是抽象方法。然后ListAdapter這個接口又實現(xiàn)了這個Adapter接口

?
1
2
3
4
public interface ListAdapter extends Adapter {
  public boolean areAllItemsEnabled();
  boolean isEnabled(int position);
}

沒錯,這個ListAdapter也是一個接口,是一個實現(xiàn)另一個接口的接口,也就是這個接口把Adapter這個接口聲明的抽象方法繼承過來然后又自己聲明了兩個抽象方法。

最后是BaseAdapter這個抽象類。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public abstract class BaseAdapter implements ListAdapter, SpinnerAdapter {
  private final DataSetObservable mDataSetObservable = new DataSetObservable();
  public boolean hasStableIds() {
    return false;
  }
  public void registerDataSetObserver(DataSetObserver observer) {
    mDataSetObservable.registerObserver(observer);
  }
  public void unregisterDataSetObserver(DataSetObserver observer) {
    mDataSetObservable.unregisterObserver(observer);
  }
  public void notifyDataSetChanged() {
    mDataSetObservable.notifyChanged();
  }
  public void notifyDataSetInvalidated() {
    mDataSetObservable.notifyInvalidated();
  }
  public boolean areAllItemsEnabled() {
    return true;
  }
  public boolean isEnabled(int position) {
    return true;
  }
  public View getDropDownView(int position, View convertView, ViewGroup parent) {
    return getView(position, convertView, parent);
  }
  public int getItemViewType(int position) {
    return 0;
  }
  public int getViewTypeCount() {
    return 1;
  }
  public boolean isEmpty() {
    return getCount() == 0;
  }
}

這個BaseAdapter是個抽象類,實現(xiàn)了兩個接口,一個就是ListAdapter接口,但是這個BaseAdapter抽象類確沒有抽象方法,并且唯一的成員變量還是一個private的,即不能被子類繼承。仔細觀察這些方法都是從ListAdapter和Adapter兩個接口中實現(xiàn)過來的。

這樣當(dāng)我們自定義的類繼承自BaseAdapter的時候,可以不用必須實現(xiàn)Adapter和ListAdapter里面的所有方法,只需要必須實現(xiàn)BaseAdapter父類中沒有實現(xiàn)的Adapter和ListAdapter里面的所有方法。

可以想下為什么不讓自定義的類直接實現(xiàn)Adapter這個接口呢?這里涉及到android的一些設(shè)計需求有關(guān)。個人認為可能Adapter接口里定義的方法不夠,定義一些最主要必須的方法滿足所有需求的方法,然后比如ListView這類的控件又需要有一些特殊的行為,然后又讓ListAdapter實現(xiàn)Adapter然后加兩個特殊的行為方法。然后呢,在BaseAdapter里面實現(xiàn)過來的方法是一些自己默認實現(xiàn)的方法,就是當(dāng)自己定義的繼承BaseAdapter父類的子類沒有去具體實現(xiàn)的方法。子類也可以重寫父類BaseAdapter的方法。

總而言之,言而總之,這種實現(xiàn)繼承關(guān)系跟android源碼框架設(shè)計的需求有關(guān)。在項目開發(fā)中我們可以借鑒學(xué)習(xí)。

三、抽象類和接口的區(qū)別

1.語法層面上的區(qū)別

1)抽象類可以提供成員方法的實現(xiàn)細節(jié),而接口中只能存在public abstract 方法;
2)抽象類中的成員變量可以是各種類型的,而接口中的成員變量只能是public static final類型的;
3)接口中不能含有靜態(tài)代碼塊以及靜態(tài)方法,而抽象類可以有靜態(tài)代碼塊和靜態(tài)方法;
4)一個類只能繼承一個抽象類,而一個類卻可以實現(xiàn)多個接口。

2.設(shè)計層面上的區(qū)別

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

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

下面看一個網(wǎng)上流傳最廣泛的例子:門和警報的例子:門都有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();
}

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

1)將這三個功能都放在抽象類里面,但是這樣一來所有繼承于這個抽象類的子類都具備了報警功能,但是有的門并不一定具備報警功能;
2)將這三個功能都放在接口里面,需要用到報警功能的類就需要實現(xiàn)這個接口中的open( )和close( ),也許這個類根本就不具備open( )和close( )這兩個功能,比如火災(zāi)報警器。

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
interface Alram {
  void alarm();
}
abstract class Door {
  void open();
  void close();
}
class AlarmDoor extends Door implements Alarm {
  void oepn() {
   //....
  }
  void close() {
   //....
  }
  void alarm() {
   //....
  }
}

希望本文所述對大家java程序設(shè)計有所幫助。

原文鏈接:http://blog.csdn.net/fancylovejava/article/details/42708721

延伸 · 閱讀

精彩推薦
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
主站蜘蛛池模板: 国产成人精品一区二区三区四区 | 日韩中文在线 | 自拍视频网站 | 中文字幕高清在线播放 | 亚洲二区视频 | 一级黄色毛片 | 在线观看视频黄 | av中文字幕在线观看 | 欧美淫视频 | 自拍亚洲欧美 | 一级电影中文字幕 | 日韩精品中文字幕在线 | 日本一区二区三区免费观看 | 免费观看黄色 | 日韩在线一区二区三区 | 一级毛片在线免费看 | 精品国产一二三区 | 精品一区二区不卡 | 电影91久久久 | 国产中文字幕一区 | jyzz中国jizz十八岁免费 | 色综合一区二区 | 国产乱码一区二区三区 | 亚洲综合中文字幕在线观看 | 黄色国产在线视频 | 国产在线乱 | 国产精品一卡二卡 | 成人在线观看网 | 亚洲精品粉嫩美女一区 | 香蕉尹人网 | 亚洲精品日韩在线 | 国产999精品久久久影片官网 | 国产一区二区三区免费在线 | 91偷拍精品一区二区三区 | 黄色a视频 | 中文字幕在线资源 | 亚洲第一se情网站 | 午夜精品网站 | 天天精品视频免费观看 | 99久久视频 | 黄色在线免费观看视频网站 |