1. 程式人生 > >java中抽象類和介面之間的區別和關係

java中抽象類和介面之間的區別和關係

首先抽象類歸根結底還是屬於類,對於抽象方法,是隻能存在於抽象類中的,我們無法再一個非抽象的類中宣告一個抽象方法,其次抽象方法只需要宣告,並不需要事先。當我們要寫一個抽象類的時候只需要在類的前面宣告為abstract即可了。同時抽象類是無法被例項化的,而抽象類的存在就是為了被繼承的,在我們定義類的時候,有的時候需要定義一個這樣的抽象類但是不想將其進行例項化的時候就可以定義一個抽象類,比如我們想要定義一些動物的類,這些動物包含很多不同種的動物,但是我們也的確沒有必要例項化一個總的動物的物件,因為並不存在這樣的物件。我們值得注意的是,對於抽象類,有以下三點值得我們注意:

  1、抽象類中的抽象方法必須定義為protected或者public,因為如果我們將其定義為私有的話,就無法被子類繼承(其實也不是不好繼承,而是不好呼叫)

  2、抽象類中的抽象方法如果沒有在某一個子類中實現(也就是該子類直接繼承了這個父類而沒有重寫該抽象方法),該子類也必須定義為抽象類

  3、抽象類是不可以例項化的。

  在其他方面,抽象類並沒有表現出和普通的類的不同。

[public] abstract class MyClass{
	abstract int fun();
}

  我們可以看的到,抽象類的誕生就是為了繼承的。

  然後我們再來看介面(interface),首先介面是一種完完全全抽象的類(當然也有人說介面並不是類,不過這不重要),介面是為方法而生的,是作為一種方法的抽象存在的,介面中可以有變數和方法,但是介面中的變數是被強制置為public static final 的,並且只能為該型別,一旦用private來修飾就會報出錯誤。對於介面中的方法,能且只能是public abstract方法,而且對於介面中的方法都不能有具體實現(實際上抽象方法都是這樣的)。在這裡我們也可以看得出來介面和類之間的巨大區別,介面看上去更加純粹的抽象。介面以關鍵詞interface來修飾。

[public] interface InterfaceName {
 
}//這是一個空的介面
  介面解決了一個非常重要的問題,就是多重繼承的問題,我們定義了一個類,它肯定是不可以繼承自多個類的(這個很容易理解,因為如果這兩個類有相同名字和引數表返回值的方法,對於同時繼承了這兩個類的子類在呼叫相應方法的時候,最終呼叫哪一個就成了一個讓人頭疼的問題),但是介面不一樣,我們定義的任何一個類是可以實現多個介面的,同時對於一個介面在不同的類中也可以有不同的實現.

  下面我們簡單分析一下介面和抽象類在各個方面不同的區別:

  在語法方面:

  1、在抽象類中的方法是可以有具體的實現的,只是對於這個類而言不存在例項化這個過程,而在介面中的方法只能是public abstract的;

  2、在抽象類中的變數是可以有多種的,但是在介面中只能是public abstract final的

  3、介面中是不能含有靜態程式碼塊或者靜態方法,但是抽象類中是可以有靜態程式碼塊和靜態方法

  4、一個類只能繼承一個抽象類,但是一個類可以實現多個介面

  同時,在定義和設計的方面:

  抽象類歸根結底還是更像類一些,也就是說實際上還是對現實事物的描述,而介面則是一種對行為的抽象。

  下面是一個在網上廣泛流傳的例子,門和警報的例子:門都有open( )和close( )兩個動作,此時我們可以定義通過抽象類和介面來定義這個抽象概念:

abstract class Door {
    public abstract void open();
    public abstract void close();
}
或者
interface Door {
    public abstract void open();
    public abstract void close();
}

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

  1)將這三個功能都放在抽象類裡面,但是這樣一來所有繼承於這個抽象類的子類都具備了報警功能,但是有的門並不一定具備報警功能;

  2)將這三個功能都放在接口裡面,需要用到報警功能的類就需要實現這個介面中的open( )和close( ),也許這個類根本就不具備open( )和close( )這兩個功能,比如火災報警器。

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

interface Alram {
    void alarm();
}
 
abstract class Door {
    void open();
    void close();
}
 
class AlarmDoor extends Door implements Alarm {
    void oepn() {
      //....
    }
    void close() {
      //....
    }
    void alarm() {
      //....
    }
}