1. 程式人生 > >Android之abstract和interface介紹

Android之abstract和interface介紹

abstract , interface

  1. // 抽象類
  2. abstractclassAbc{
  3. // 抽象類中的抽象方法
  4. publicabstractvoid setData(int i);
  5. publicvoidPrint(){
  6. // 呼叫了抽象方法
  7. setData(100);
  8. }
  9. }
  10. // 該類繼承抽象類
  11. classBcdextendsAbc{
  12. @Override
  13. publicvoid setData(int i){
  14. System.out.print(i);
  15. }
  16. }
  17. // 主類
  18. classMain{
  19. // 主方法
  20. publicMain(){
  21. // 繼承抽象類的類必須實現抽象方法
  22. // 除非繼承抽象類的型別也是抽象類
  23. Bcd bcd =newBcd();
  24. bcd
    .Print();
  25. }
  26. // 另外一種情況
  27. // 實現抽象類的時,必須實現類中抽象方法
  28. Abc abc =newAbc(){
  29. @Override
  30. publicvoid setData(int i){
  31. System.out.print(i);
  32. }
  33. };
  34. }
  1. // 抽象類
  2. abstractclassServer{
  3. privateint port;
  4. // 抽象類中的抽象方法
  5. publicabstractvoid failure(String data);
  6. publicabstractvoid success(int code);
  7. publicvoid start(){
  8. // ... start ...
  9. if(true|false){
  10. success
    (String data);
  11. }else{
  12. failuer(int code);
  13. }
  14. }
  15. }
  16. // 主類
  17. classMain{
  18. publicMain(){
  19. Server server =newServer(){
  20. @Override
  21. publicvoid success(String data){
  22. System.out.print(data)
  23. }
  24. @Override
  25. publicvoid failure(int code){
  26. System.out.print(code)
  27. }
  28. };
  29. server.start();
  30. }
  31. }

abstract class和interface在Java語言中都是用來進行抽象類定義.

使用abstract class的方式定義Demo抽象類的方式如下:

  1. abstractclassDemo
  2. abstractvoid method1();
  3. abstractvoid method2();

使用interface的方式定義Demo抽象類的方式如下:

  1. interfaceDemo{
  2. void method1();
  3. void method2();
  4. }

在abstract class方式中,Demo可以有自己的資料成員,也可以有非abstarct的成員方法

而在interface方式的實現中,Demo只能夠有靜態的不能被修改的資料成員(也就是必須是static final的)

所有的成員方法都是abstract的。從某種意義上說,interface是一種特殊形式的abstract class。

考慮這樣一個例子,假設在我們的問題領域中有一個關於Door的抽象概念,該Door具有執行兩個動作open和close

此時我們可以通過abstract class或者interface來定義一個表示該抽象概念的型別,定義方式分別如下所示:

使用abstract class方式定義Door:

  1. abstractclassDoor{
  2. abstractvoid open();
  3. abstractvoid close();
  4. }

使用interface方式定義Door:

  1. interfaceDoor{
  2. void open();
  3. void close();
  4. }

其他具體的Door型別可以extends使用abstract class方式定義的Door或者implements使用interface方式定義的Door。

看起來好像使用abstract class和interface沒有大的區別。

如果現在要求Door還要具有報警的功能。我們該如何設計針對該例子的類結構呢

解決方案一:

簡單的在Door的定義中增加一個alarm方法,如下:

  1. abstractclassDoor{
  2. abstractvoid open();
  3. abstractvoid close();
  4. abstractvoid alarm();
  5. }
  1. 或者
  1. interfaceDoor{
  2. void open();
  3. void close();
  4. void alarm();
  5. }

那麼具有報警功能的AlarmDoor的定義方式如下:

  1. classAlarmDoorextendsDoor{
  2. void open(){}
  3. void close(){}
  4. void alarm(){}
  5. }
  1. 或者
  1. classAlarmDoorimplementsDoor
  2. void open(){}
  3. void close(){}
  4. void alarm(){}

這種方法違反了面向物件設計中的一個核心原則ISP(Interface Segregation Priciple)

在Door的定義中把Door概念本身固有的行為方法和另外一個概念”報警器”的行為方法混在了一起。

這樣引起的一個問題是那些僅僅依賴於Door這個概念的模組會因為”報警器”這個概念的改變而改變,反之依然。

解決方案二:

既然open、close和alarm屬於兩個不同的概念,根據ISP原則應該把它們分別定義在代表這兩個概念的抽象類中。

定義方式有:這兩個概念都使用abstract class方式定義;

兩個概念都使用interface方式定義;一個概念使用abstract class方式定義,另一個概念使用interface方式定義。

方式定義。如下所示:

  1. abstractclassDoor{
  2. abstractvoid open();
  3. abstractvoid close();
  4. }
  5. interfaceAlarm{
  6. void alarm();
  7. }
  8. classAlarmDoorextendsDoorimplementsAlarm{
  9. void open(){}
  10. void close(){}
  11. void alarm(){}
  12. }

這種實現方式基本上能夠明確的反映出我們對於問題領域的理解,正確的揭示我們的設計意圖。

其實abstract class表示的是”is a”關係, interface表示的是”like a”關係,大家在選擇時可以作為一個依據

abstract class和interface是Java語言中的兩種定義抽象類的方式,它們之間有很大的相似性。

但是對於它們的選擇卻又往往反映出對於問題領域中的概念本質的理解

對於設計意圖的反映是否正確、合理,因為它們表現了概念間的不同的關係(雖然都能夠實現需求的功能)。

這其實也是語言的一種的慣用法,希望讀者朋友能夠細細體會。

相關推薦

Androidabstractinterface介紹

abstract , interface // 抽象類abstractclassAbc{// 抽象類中的抽象方法publicabstractvoid setData(int i);publicvoidPrint(){// 呼叫了抽象方法 setData(1

java集合系列——SetHashSetTreeSet介紹(十)

最大 ... gpo 鏈表 key 同步 中大 nds set接口 一.Set的簡介Set是一個不包含重復元素的 collection。更確切地講,set 不包含滿足 e1.equals(e2) 的元素。對 e1 和 e2,並且最多包含一個為 null 的元素。 Set的類

java abstractinterface

abstract (抽象) 用abstract關鍵字來修飾一個類時,這個類叫做抽象類;  用abstract來修飾一個方法時,該方法叫做抽象方法。 抽象方法:只有方法的宣告,沒有方法的實現。以分號結束:abstract int abstractMethod( int a );含有抽象方法的

Android.mk 語法變數介紹

一、簡介 Android.mk 是一種指令碼語言,是將 C/C++ 原始檔粘合至 NDK 的構建檔案。 官網對 Android.mk 的介紹:https://developer.android.com/ndk/guides/android_mk 二、一些超級基本的語法 例如我

HDFS encryption 實戰背景架構介紹

1、HDFS encryption背景 在全世界,為零滿足隱私和其他安全需求,很多政府部門、金融部門和管理單位強制要求資料加密。例如 銀行支付行業為零滿足資訊保安必須滿足支付卡行業資料安全標準 Payment Card Industry Data Security Standard

簡談對Java的abstractinterface的理解

Java通過Abstract與Interface來實現對抽象概念的定義1。這兩者強化了Java面向物件的特點。Abstract與Interface對抽象概念的支援很相似,但是區別亦比較顯著。 class A extends B implements C,D,E;2

abstract interface區別

1.介面就是提供一種統一的’協議’,而介面中的屬性也屬於’協議’中的成員.它們是公共的,靜態的,最終的常量.介面中的屬性,相當於全域性常量.介面只是對一類事物的屬性和行為更高層次的抽象。對修改關閉,對擴充套件(不同的實現implements)開放,介面是對開閉原則的一種體現抽

Androiddrawablemipmap目錄區別

在android studio中我們建立專案後,在資源res檔案中有drawable和mipmap兩種存放圖片的資料夾,在使用哪一個資料夾來存放圖片,一直都很有爭議: android 在 API level 17 加入了 mipmap 技術,對 bitmap 圖片的渲染支援 mipmap 技術,

Java學習筆記四-abstractinterface

Abstract class 抽象類。 一個類用abstract修飾,這就是一個抽象類。 抽象方法,一個方法用abstract修飾,這就是一個抽象方法。 抽象類裡面有抽象的方法(當然也可以有具體的方法也可以沒有抽象方法),但是不具體實現,留給子類去實現。抽

Abstract Interface 使用的舉例+Abstract Interface也可以放到一起

本文僅把介面和抽象類的實現與繼承情況下各個強制覆蓋重寫的情況舉個例子。 比對1: 介面類 Interface1 介面類Interface2繼承抽象類1,並增加抽象方法 結論:抽象類只能繼承抽象類,且不會強制重寫父類中的方法 比對2: 抽象類Abstract3實現介面類

AndroidHttpClient HttpResponse 小結

三步曲:  1.建立HttpGet或者HttpPost物件,將要請求的URL物件構造方法傳入HttpGet、HttpPost物件  2.通過HttpClent介面的實現類DefaultClent.的excute(HttpUriRequest request)而我們已經知道

淺談abstractinterface

剛看到這兩個詞,很多人估計都會有一種選擇恐懼症,其實,如果真的稍微瞭解了一下兩個的不同之處以後,就不會有那麼難的抉擇了。 語法上             從語法上來看,abstract的可以擁有自己的屬性和自己的非抽象方法,同時,子類可以覆蓋掉父類的一些屬性的值。inter

abstractinterface語法上有什麼區別?

1.抽象類可以有構造方法,介面中不能有構造方法。2.抽象類中可以有普通成員變數,介面中沒有普通成員變數3.抽象類中可以包含非抽象的普通方法,介面中的所有方法必須都是抽象的,不能有非抽象的普通方法。4. 抽象類中的抽象方法的訪問型別可以是public,protected和(預設型別,雖然eclipse下不報錯,

androidlayout_toLeftOflayout_toRightOf出現的錯誤

錯誤是這樣的,佈局檔案如下,總是在SeekBar裡面的這一句android:layout_toLeftOf="@id/voice_max"報錯,差點氣得我吐血,明明沒有錯誤的. <ImageView android:id="@+id/voice_

AndroidToolBar自定義ToolBar實現沉浸式狀態列

沉浸式狀態列確切的說應該叫做透明狀態列。一般情況下,狀態列的底色都為黑色,而沉浸式狀態列則是把狀態列設定為透明或者半透明。 沉浸式狀態列是從android Kitkat(Android 4.4)開始出

java中的abstractinterface差異

這裡需要談到抽象類和Interface的差別,abstract class和interface是支援抽象類定義的兩種機制。正是由於這兩種機制的存在,才賦予了Java強大的面向物件能力,兩者的區別如下: (1)相同點 A,兩者都是抽象類,都不能例項化。 B,inter

AndroidObserverObservable

package java.util; public class Observable { private boolean changed = false; private final ArrayList<Observer> observers; public Observable(

一起學AndroidToggleButtonSwitch

本文以一個簡單的小例子,簡述在Android開發中ToggleButton(開關按鈕)和Switch(開關)的簡單使用,僅供學習分享使用。 概述 ToggleButton是一個有兩種狀態(checked/unchecked)的按鈕,經常用於開/關等場景中,預設文字顯示(ON/OFF),Switch 是一個

Androidverticalhorizontal的區別

當 android:orientation=”vertical” 時, 只有水平方向的設定才起作用,垂直方向的設定不起作用。即:left,right,center_horizontal 是生效的。當 android:orientation=”horizontal” 時, 只

AndroidDatePickerTimePicker實現以及自定義大小

 關於日期和時間的幾個相關控制元件,包括DatePicker(日期選擇控制元件)、TimePicker(時間選擇控制元件)、DatePickerDialog(日期選擇對話方塊)、TimePickerDialog(時間選擇對話方塊)、AnalogClock(模擬時鐘控制元件