Java基礎篇(一):接口與抽象類


抽象類##

抽象類是用來描述抽象行為的,比如Animal,我們不知道Animal具體有會有什么樣的行為,只有具體的動物類,如Dog,Cat才有具體的行為,才能夠被實例化。抽象類是實現(xiàn)多態(tài)的一種機制,它可以包含具體方法(有具體實現(xiàn)的方法),也可以包含抽象方法,而繼承它的子類必須實現(xiàn)這些方法,下面總結了一下抽象類的特性:

  1. 抽象類不能被實例化,但可以有構造函數(shù)
  2. 抽象方法必須由子類進行重寫
  3. 只要包含一個抽象方法的類,就必須定義為抽象類,不管是否還包含其他方法
  4. 抽象類中可以包含具體的方法,也可以不包含抽象方法
  5. 抽象類可以包含普通成員變量,其訪問類型可以任意
  6. 抽象類也可以包含靜態(tài)成員變量,其訪問類型可以任意
  7. 子類中的抽象方法不能與父類的抽象方法同名
  8. abstract不能與private、static、final或native并列修飾同一個方法

下面通過一個實例類來說明抽象類的使用

// 抽象類Animal,包含了一個抽象方法cry
abstract class Animal
{
    public abstract void cry(); 
}

// 子類Dog繼承的抽象類Animal,必須實現(xiàn)其抽象方法cry
class Dog extends Animal
{
    public void cry()
    {
        System.out.println("Dog cry");
    }
}
// 同樣,子類Cat繼承的抽象類Animal,必須實現(xiàn)其抽象方法cry
class Cat extends Animal
{
    public void cry()
    {
        System.out.println("Cat cry");
    }
}

public class Test 
{
    public static void main(String[] args) {
        Animal a1 = new Dog();  // 抽象類引用指向子類實例
        Animal a2 = new Cat();
        
        a1.cry();
        a2.cry();
    }
}

輸出結果如下:

Dog cry
Cat cry

由輸出結果可以知道,使用a1,a2調用cry方法調用的是子類的cry方法,這是動態(tài)綁定,是實現(xiàn)多態(tài)的一種機制。

接口##

接口在Java當中是通過關鍵字interface來實現(xiàn),接口不是類,所以也不能被實例化,接口是用來建立類與類之間的協(xié)議,它的提供的只是一種形式,而沒有具體的實現(xiàn)。實現(xiàn)類實現(xiàn)(implements)接口,必須實現(xiàn)接口的全部方法
接口是抽象類的延伸,Java不允許多重繼承(即不能有多個父類,只能有一個),但可以實現(xiàn)多個接口。在使用接口的過程中,就注意以下幾個問題:

  1. 接口中不能有構造方法。
  2. 接口的所有方法自動被聲明為public,而且只能為public,如果使用protected、private,會導致編譯錯誤。
  3. 接口可以定義"成員變量",而且會自動轉為public final static,即常量,而且必須被顯式初始化。
  4. 接口中的所有方法都是抽象方法,不能包含實現(xiàn)的方法,也不能包含靜態(tài)方法
  5. 實現(xiàn)接口的非抽象類必須實現(xiàn)接口的所有方法,而抽象類不需要
  6. 不能使用new來實現(xiàn)化接口,但可以聲明一個接口變量,它必須引用一個實現(xiàn)該接口的類的對象,可以使用instanceOf來判斷一個類是否實現(xiàn)了某個接口,如if (object instanceOf ClassName){doSth()};
  7. 在實現(xiàn)多接口的時候一定要注意方法名的重復

抽象類與接口的區(qū)別##

語法層次###

抽象類的定義,如下所示:

// 抽象類中可以包含抽象方法與非抽象方法(必須給出實現(xiàn))
public abstract class Demo 
{
    abstract void foo1();
    void foo2(){
        //實現(xiàn)
    }
}

接口的定義,如下所示:

interface Demo
{
    // 接口中的方法自動轉為public abstract
    void foo1();
    void foo2();
}

抽象類方式中,抽象類可以擁有任意范圍的成員數(shù)據(jù),同時也可以擁有自己的非抽象方法,但是接口方式中,它僅能夠有靜態(tài)、不能修改的成員數(shù)據(jù)(即final static,但是我們一般是不會在接口中使用成員數(shù)據(jù)),同時它所有的方法都必須是抽象的。在某種程度上來說,接口是抽象類的特殊化。

設計層次###

從設計的層面來看,我覺得抽象類與接口有如下幾個不同點:

  1. 抽象層次不同。可以這樣理解,抽象類是對類的抽象,接口是對行為的抽象。抽象類對是類整體進行抽象,包括屬性、行為,而接口是對類局部(行為)進行抽象。
  2. 跨域不同。抽象類所跨域的是具有相似特點的類,而接口可以跨域不同的類。抽象類所體現(xiàn)的是一種繼承關系,要想使得繼承關系合理,父類和派生類之間必須存在"is-a" 關系,即父類和派生類在概念本質上應該是相同的。對于接口則不然,并不要求接口的實現(xiàn)者和接口定義在概念本質上是一致的, 僅僅是實現(xiàn)了接口定義的契約而已。

總結##

  1. 抽象類在java語言中所表示的是一種繼承關系,一個子類只能存在一個父類,但是可以存在多個接口。
  2. 在抽象類中可以擁有自己的成員變量和非抽象類方法,但是接口中只能存在靜態(tài)的不可變的成員數(shù)據(jù)(不過一般都不在接口中定義成員數(shù)據(jù)),而且它的所有方法都是抽象的。
  3. 抽象類和接口所反映的設計理念是不同的,抽象類所代表的是"is-a"的關系,而接口所代表的是"like-a"的關系。抽象類和接口是java語言中兩種不同的抽象概念,他們的存在對多態(tài)提供了非常好的支持,雖然他們之間存在很大的相似性。但是對于他們的選擇往往反應了您對問題域的理解。只有對問題域的本質有良好的理解,才能做出正確、合理的設計。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 一、抽象類 1、抽象類含義的概括: 當多個類出現(xiàn)相同功能時,但功能主體不同,這樣可以向上抽取,抽取時只抽取功能定義...
    玉圣閱讀 927評論 0 6
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,623評論 18 399
  • 你很清楚的知道什么時候用抽象類,什么時候用接口么?p.s. 多文字預警! 1 抽象類和接口簡介 1.1 抽象類 ...
    Sharember閱讀 2,424評論 9 55
  • 一:java概述:1,JDK:Java Development Kit,java的開發(fā)和運行環(huán)境,java的開發(fā)工...
    ZaneInTheSun閱讀 2,800評論 0 11
  • 本文出自 Eddy Wiki ,轉載請注明出處:http://eddy.wiki/interview-java.h...
    eddy_wiki閱讀 1,268評論 0 5

友情鏈接更多精彩內容