国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Java 接口與抽象類方式實現類的擴展

neroneroffy / 2815人閱讀

摘要:子類繼承抽象類,并具體實現方法。抽象類的使用區別于具體類,抽象類無法直接創建抽象類對象,但是可以聲明抽象類的變量,引用抽象類對應具體子類對象。接口優于抽象類中討論到一條規則接口優于抽象類。接口聲明能力,抽象類提供默認實現全部或部分方法。

接口

類,強調數據類型(自定義)的概念,在一些情況下,并不能反映對象以及對象操作的本質。有時我們關注的并非對象的類型,而是對象的能力。

接口聲明一組功能,作為協議(約定),但是自身不去實現功能方法。接口形式的交互涉及兩方對象:一方實現接口,另一方使用接口,雙方并不直接依賴,而是針對接口編程。

接口定義

接口定義即聲明方法,制定功能協議。

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

相關文章

  • Java設計模式-六大原則

    摘要:依賴倒置原則是個設計原則中最難以實現的原則,它是實現開閉原則的重要途徑,依賴倒置原則沒有實現,就別想實現對擴展開放,對修改關閉。 1、單一職能原則(Single Responsibility Principle, SRP) 定義 There should never be more than one reason for a class to change.應該有且僅有一個原因引起類的...

    molyzzx 評論0 收藏0
  • java七大設計原則

    摘要:在我們做系統設計時,經常會設計接口或抽象類,然后由子類來實現抽象方法,這里使用的其實就是里氏替換原則。 1.開閉原則(Open Close Principle/OCP) 定義:一個類、模塊和函數應該對擴展開放,對修改關閉。 開放-封閉原則的意思就是說,你設計的時候,時刻要考慮,盡量讓這個類是足夠好,寫好了就不要去修改了,如果新需求來,我們增加一些類就完事了,原來的代碼能不動則不動。這個...

    Prasanta 評論0 收藏0
  • Java-001-面向對象

    摘要:單一職責原則可以看做是低耦合高內聚在面向對象原則上的引申,將職責定義為引起變化的原因,以提高內聚性來減少引起變化的原因。抽象的穩定性決定了系統的穩定性,因為抽象是不變的,依賴于抽象是面向對象設計的精髓,也是依賴倒置原則的核心。 Java-面向對象 什么是面過程 把題分解成一個一個步驟,每個步驟用函數實現,依次調用即可。就是說,在進行面向過程 編程的時候,不需要考慮那么多,上來先定義一個...

    gekylin 評論0 收藏0
  • java學習(三) —— 面對對象

    摘要:前言是面對對象的語言,因此有必要單獨紀錄下對象的各種定義和理解。面對對象基本概述概述是基于面向過程的變成思想,是對面向過程的一種封裝。面對對象開發就是不斷的創建對象,使用對象,指揮對象做事情。面對對象設計其實就是在管理和維護對象之間的關系。 前言 java是面對對象的語言,因此有必要單獨紀錄下對象的各種定義和理解。 面對對象,主要包括:面向對象思想,類與對象及其使用,對象的內存圖,成...

    褰辯話 評論0 收藏0
  • 《設計模式》3.結構型模式

    摘要:類的適配器結構目標角色這就是所期待得到的接口,由于是類適配器模式,因此目標不可以是類。這種類型的設計模式屬于結構型模式,它是作為現有的類的一個包裝。和適配器模式的關系適配器模式的用意是改變所考慮對象的接口,而代理模式不能改變。 點擊進入我的博客 3.1 適配器模式 適配器模式把一個類的接口變換成客戶端所期待的另一種接口,使得原本因接口不匹配而無法在一起工作的兩個類能夠在一起工作。 3...

    Yuqi 評論0 收藏0

發表評論

0條評論

neroneroffy

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<