摘要:子類繼承抽象類,并具體實現方法。抽象類的使用區別于具體類,抽象類無法直接創建抽象類對象,但是可以聲明抽象類的變量,引用抽象類對應具體子類對象。接口優于抽象類中討論到一條規則接口優于抽象類。接口聲明能力,抽象類提供默認實現全部或部分方法。
接口
類,強調數據類型(自定義)的概念,在一些情況下,并不能反映對象以及對象操作的本質。有時我們關注的并非對象的類型,而是對象的能力。
接口聲明一組功能,作為協議(約定),但是自身不去實現功能方法。接口形式的交互涉及兩方對象:一方實現接口,另一方使用接口,雙方并不直接依賴,而是針對接口編程。
接口定義
接口定義即聲明方法,制定功能協議。
Java 使用 interface 關鍵字聲明接口,修飾符一般采用 public。
接口內部聲明方法時,通常不需要加修飾符,默認視為 public abstract。
接口實現
類可以實現接口,表示類的對象具有接口(協議)制定的功能。
Java 使用 implements 關鍵字實現接口。
實現接口必須實現接口中聲明的所有方法。
public interface Printable { void print(); } public class A6 implements Printable { public void print() { System.out.println("Hello"); } public static void main(String args[]) { A6 obj = new A6(); obj.print(); } }
接口擴展
接口可以擴展另一個接口甚至多個接口,其方式與類可以擴展(繼承)另一個類的方式相同,使用 extends 關鍵字,但是類的繼承限制為單繼承。
public interface BallGame extends Sport, Match {}
類的繼承與接口實現可以共存,并且類可以實現多個接口,從某種形式上構成多繼承結構。
public class Football extends Ball implements Sport, Match {}
等價于:
public class Football extends Ball implements BallGame {}
接口使用
與類不同,無法直接 new 創建接口對象,但是可以聲明接口類型的變量,引用實現了接口的類對象。
public interface Printable { void print(); } public class Main { public static void main(String args[]) { Printable obj = new Printable() { @Override public void print() { System.out.println("Hello"); } } obj.print(); } }
上述代碼看似創建接口對象,實則創建匿名內部類對象,由其實現接口。
接口有時更能反映出對象的本質(能力,一組功能協議)。所謂針對接口編程,使用接口而非具體實現接口的類型,統一處理不同類型對象,旨在降低耦合性,提高靈活性。當然,接口本身由于沒有代碼實現,并沒有太大用處,需要依賴具體實現,才能生效。
抽象類抽象類,顧名思義抽象的類,一般代表多個具體類(子類)上層公共的父類,作為基類統一調用接口(方法)。
抽象類的意義抽象方法和抽象類密不可分,抽象方法是將來作為統一接口調用,而目前不知道如何實現的方法,只有通過子類重寫方法才能具體實現功能。
抽象類 Animal 定義 sound() 方法作為統一接口調用,因為無法確定 sound() 方法該如何具體實現,Java 使用 abstract 關鍵字聲明方法為抽象方法,無需定義方法體。子類 Dog 繼承抽象類 Animal,并具體實現 sound() 方法。
//abstract parent class abstract class Animal { //abstract method public abstract void sound(); } //Dog class extends Animal class public class Dog extends Animal { public void sound() { System.out.println("Woof"); } public static void main(String args[]) { Animal obj = new Dog(); obj.sound(); } }抽象類的使用
區別于具體類,抽象類無法直接 new 創建抽象類對象,但是可以聲明抽象類的變量,引用抽象類對應具體子類對象。
定義了抽象方法的類必須聲明為抽象類,但是抽象類可以沒有抽象方法。
抽象類和具體類一樣,可以定義并實現具體方法,實例變量等。
一個類在繼承抽象類后,必須實現抽象類的所有抽象方法,除非類自己也聲明為抽象類。
抽象類介于接口和類之間。
接口與抽象類的區別及應用場景相同點
無法創建對象(實例化)
抽象方法由具體類實現(統一接口)
作為引用變量指向具體類對象(多態性)
不同點
對比條件 | 接口 | 抽象類 |
---|---|---|
構造器 | 不存在 | 可以有 |
具體方法 | 不存在 | 可以有 |
實例變量 | 不存在 | 可以有 |
“多繼承” | 支持 | 不支持 |
接口 = 純抽象類(所有方法都是抽象方法)
應用場景
考慮多態性、統一接口調用的同時,需要實例變量、帶有默認實現的具體方法,使用抽象類。
聲明一組方法,卻又不想每個具體類都實現所有方法,可以使用抽象類,借助空方法,交由具體類自行決定重寫其感興趣的方法。
具體類已經有父類,受 Java 限制只允許單繼承,只能選擇通過實現接口方式擴展類。
《Effective Java》中討論到一條規則:“接口優于抽象類”?;谌缦抡摂啵?/p>
現有的類可以很容易被更新,以實現新的接口。
一般來說,無法更新現有的類來擴展新的抽象類。如果希望讓兩個類擴展同一個抽象類,就必須把抽象類放到類型層次的高處,這樣會間接地傷害到類層次,迫使這個公共祖先的所有子類都擴展這個新的抽象類。接口是定義 mixin(混合類型)的理想選擇。
混合類型除了自身類型之外,還可以提供某些可選擇的行為。例如,實現 Comparable 接口的實例之間可以相互比較。接口允許我們構造非層次結構的類型框架。
類型層次對于組織某些事物是非常合適的,但是并非所有事物都能被整齊地組織成一個嚴格的層次結構。類層次過于臃腫缺乏靈活性,通過接口擴展行為,一定程度上模擬多重繼承。
P.S. Java 限制只允許單繼承,即類不可能有一個以上的父類。
規則存在例外,即當演變的容易性比靈活性和功能更為重要的時候,應該使用抽象類來定義類型。抽象類的演變比接口的演變要容易得多,當在抽象類中增加新的具體方法,它包含合理的默認實現,該抽象類的所有現有實現都將提供這個新的方法。接口一旦被公開發行,并且已被廣泛實現,再想改變這個接口幾乎是不可能的。當在公有接口中增加方法,不可避免破壞實現這個接口的所有現有的類。
書中建議程序員為“每個重要接口都提供一個抽象的骨架實現(skeletal implementation)類,把接口和抽象類的優點結合起來。接口的作用仍然是定義類型,但是骨架實現類接管了所有與接口實現相關的工作。”
Java 類庫中存在許多一個接口對應一個抽象類的設計,例如:Collection 接口與 AbstractCollection 抽象類、List 接口與AbstractList 抽象類...。
抽象類和接口是配合而非替代關系。接口聲明能力,抽象類提供默認實現(全部或部分方法)。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/71771.html
摘要:依賴倒置原則是個設計原則中最難以實現的原則,它是實現開閉原則的重要途徑,依賴倒置原則沒有實現,就別想實現對擴展開放,對修改關閉。 1、單一職能原則(Single Responsibility Principle, SRP) 定義 There should never be more than one reason for a class to change.應該有且僅有一個原因引起類的...
摘要:在我們做系統設計時,經常會設計接口或抽象類,然后由子類來實現抽象方法,這里使用的其實就是里氏替換原則。 1.開閉原則(Open Close Principle/OCP) 定義:一個類、模塊和函數應該對擴展開放,對修改關閉。 開放-封閉原則的意思就是說,你設計的時候,時刻要考慮,盡量讓這個類是足夠好,寫好了就不要去修改了,如果新需求來,我們增加一些類就完事了,原來的代碼能不動則不動。這個...
摘要:單一職責原則可以看做是低耦合高內聚在面向對象原則上的引申,將職責定義為引起變化的原因,以提高內聚性來減少引起變化的原因。抽象的穩定性決定了系統的穩定性,因為抽象是不變的,依賴于抽象是面向對象設計的精髓,也是依賴倒置原則的核心。 Java-面向對象 什么是面過程 把題分解成一個一個步驟,每個步驟用函數實現,依次調用即可。就是說,在進行面向過程 編程的時候,不需要考慮那么多,上來先定義一個...
摘要:前言是面對對象的語言,因此有必要單獨紀錄下對象的各種定義和理解。面對對象基本概述概述是基于面向過程的變成思想,是對面向過程的一種封裝。面對對象開發就是不斷的創建對象,使用對象,指揮對象做事情。面對對象設計其實就是在管理和維護對象之間的關系。 前言 java是面對對象的語言,因此有必要單獨紀錄下對象的各種定義和理解。 面對對象,主要包括:面向對象思想,類與對象及其使用,對象的內存圖,成...
摘要:類的適配器結構目標角色這就是所期待得到的接口,由于是類適配器模式,因此目標不可以是類。這種類型的設計模式屬于結構型模式,它是作為現有的類的一個包裝。和適配器模式的關系適配器模式的用意是改變所考慮對象的接口,而代理模式不能改變。 點擊進入我的博客 3.1 適配器模式 適配器模式把一個類的接口變換成客戶端所期待的另一種接口,使得原本因接口不匹配而無法在一起工作的兩個類能夠在一起工作。 3...
閱讀 2623·2021-09-28 09:36
閱讀 2234·2021-09-07 09:58
閱讀 1498·2019-08-26 13:53
閱讀 1281·2019-08-23 17:53
閱讀 3031·2019-08-23 15:34
閱讀 1855·2019-08-23 15:34
閱讀 2869·2019-08-23 12:04
閱讀 3722·2019-08-23 10:56