抽象類與接口

一、抽象類

1、抽象類

包含一個抽象方法的類就是抽象類

2、抽象方法

聲明而未被實現的方法,抽象方法必須使用abstract關鍵詞字聲明

1

2

3

4

5

6

public abstract class People {  //關鍵詞abstract,聲明該類爲抽象類

    public int age;

    public void Num() {

    }

    public abstract Name(); //聲明該方法爲抽象方法

}  

3、抽象類被子類繼承,子類(如果不是抽象類)必須重寫抽象類中的所有抽象方法

4、抽象類不能被直接實例化,要通過其子類進行實例化

5、只要包含一個抽象方法的抽象類,該方法必須要定義成抽象類,不管是否還包含有其他方法。

6、子類中的抽象方法不能與父類的抽象方法同名。

7、abstract不能與final並列修飾同一個類。

8、abstract 不能與private、static、final或native並列修飾同一個方法。

 

爲什麼需要用到抽象類?

 在下面這個例子中,把打印機類封裝成抽象類,把print定義成抽象類,當HPPrinter和CannonPrinter要繼承printer類的時候,必須重寫print函數。這樣寫的好處是,每個打印機都有自己打印方式,此舉可以防止子類沒有寫明打印方式。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

public abstract void Printer() {

    public void open() {

        system.out.print("打印機開啓");

    }

    public void close() {

        system.out.print("打印機關閉");

    }

    abstract void print();  //把print方法定義爲抽象方法

}

 

public HPPrinter extends Printer {

    void print(){             //必須重寫抽象方法print()   

        system.out.print("惠普打印機開始打印");

    };

}

 

public CanonPrinter extends Printer {

    void print(){             //必須重寫抽象方法print()

        system.out.print("佳能打印機開始打印");

    };

}

 

二、接口

1、接口是java中最重要的概念,接口可以理解爲一種特殊的類,裏面全部是由全局常量和公共的抽象方法組成

接口中所有方法都是抽象方法;

接口當中所有的方法都是public類型

2、接口的格式

1

2

3

4

interface interfaceName{

    全局常量

    抽象方法

}

 

3、接口的實現也必須通過子類,使用關鍵字implements,而且接口是可以多實現的

1

2

3

class implements Inter1,Inter2{ //Inter1和Inter2是接口

    ...

}

 

4、一個類可以同時繼承抽象類和接口

1

2

3

class extends Abs implements Inter1,Inter2{ //Abs是一個抽象類

    ...

}

 

5、一個接口不能繼承抽象類,但可以通過extends關鍵字繼承多個接口,實現接口的多繼承

1

2

3

interface Inter implements Inter1,Inter2{ //Inter、Inter1、Inter2都爲接口

    ...

}

  

三、抽象類和接口區別

本節參考自(http://www.cnblogs.com/chenssy/ 作者:chenssy

(一)語法層次

1

2

3

4

5

6

7

8

9

public abstract class People {  //關鍵詞abstract,聲明該類爲抽象類

    void Num();      

    abstract void Name();    //聲明該方法爲抽象方法

}

 

Interface Person {

  void Num();

  void Name();

} 

  • 抽象類方式中,抽象類可以擁有任意範圍的成員數據,同時也可以擁有自己的非抽象方法,

  • 但是接口方式中,它僅能夠有靜態、不能修改的成員數據(但是我們一般是不會在接口中使用成員數據),同時它所有的方法都必須是抽象的。

  • 在某種程度上來說,接口是抽象類的特殊化。

  • 對子類而言,它只能繼承一個抽象類(這是java爲了數據安全而考慮的),但是卻可以實現多個接口。

(二)設計層次

1、 抽象層次不同

抽象類是對類抽象,而接口是對行爲的抽象。抽象類是對整個類整體進行抽象,包括屬性、行爲,但是接口卻是對類局部(行爲)進行抽象。

2、 跨域不同

抽象類所跨域的是具有相似特點的類,而接口卻可以跨域不同的類。我們知道抽象類是從子類中發現公共部分,然後泛化成抽象類,子類繼承該父類即可,但是接口不同。實現它的子類可以不存在任何關係,共同之處。例如貓、狗可以抽象成一個動物類抽象類,具備叫的方法。鳥、飛機可以實現飛Fly接口,具備飛的行爲,這裏我們總不能將鳥、飛機共用一個父類吧!所以說抽象類所體現的是一種繼承關係,要想使得繼承關係合理,父類和派生類之間必須存在"is-a" 關係,即父類和派生類在概念本質上應該是相同的。對於接口則不然,並不要求接口的實現者和接口定義在概念本質上是一致的, 僅僅是實現了接口定義的契約而已。

3、 設計層次不同

對於抽象類而言,它是自下而上來設計的,我們要先知道子類才能抽象出父類,而接口則不同,它根本就不需要知道子類的存在,只需要定義一個規則即可,至於什麼子類、什麼時候怎麼實現它一概不知。比如我們只有一個貓類在這裏,如果你這是就抽象成一個動物類,是不是設計有點兒過度?我們起碼要有兩個動物類,貓、狗在這裏,我們在抽象他們的共同點形成動物抽象類吧!所以說抽象類往往都是通過重構而來的!但是接口就不同,比如說飛,我們根本就不知道會有什麼東西來實現這個飛接口,怎麼實現也不得而知,我們要做的就是事前定義好飛的行爲接口。所以說抽象類是自底向上抽象而來的,接口是自頂向下設計出來的。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章