1. 抽象類
- 什么是抽象類
包含一個抽象方法的類就是抽象類
- 抽象方法
聲明而未被實現的方法,抽象方法必須使用
abstract
關鍵詞字聲明
public abstract class People { //關鍵詞abstract,聲明該類為抽象類
public int age;
public void Num() {
}
public abstract Name(); //聲明該方法為抽象方法
}
抽象類被子類
繼承
,子類(如果不是抽象類)必須重寫
抽象類中的所有抽象方法抽象類
不能被直接實例化
,要通過其子類進行實例化只要包含一個抽象方法的抽象類,該方法必須要定義成抽象類,不管是否還包含有其他方法。
子類中的抽象方法不能與父類的抽象方法同名。
abstract
不能與final
并列修飾同一個類。abstract
不能與private、static、final
或native
并列修飾同一個方法。
為什么需要用到抽象類?
在下面這個例子中,把打印機類封裝成抽象類,把print
定義成抽象類,當HPPrinter
和CannonPrinter
要繼承printer
類的時候,必須重寫print
函數。這樣寫的好處是,每個打印機都有自己打印方式,此舉可以防止子類沒有寫明打印方式。
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("佳能打印機開始打印");
};
}
2. 接口
接口是java中最重要的概念,接口可以理解為一種特殊的類,里面全部是由全局常量和公共的抽象方法組成,接口中所有方法都是抽象方法.接口當中所有的方法都是public類型.
接口的格式:
interface interfaceName{
全局常量
抽象方法
}
- 接口的實現也必須通過子類,使用關鍵字implements,而且接口是可以多實現的
class A implements Inter1,Inter2{ //Inter1和Inter2是接口
...
}
- 一個類可以同時繼承抽象類和接口
class A extends Abs implements Inter1,Inter2{ //Abs是一個抽象類
...
}
- 一個接口不能繼承抽象類,但可以通過extends關鍵字繼承多個接口,實現接口的多繼承
interface Inter implements Inter1,Inter2{ //Inter、Inter1、Inter2都為接口
...
}
3. 抽象類和接口區別
3.1 語法層次
public abstract class People { //關鍵詞abstract,聲明該類為抽象類
void Num();
abstract void Name(); //聲明該方法為抽象方法
}
Interface Person {
void Num();
void Name();
}
- 抽象類方式中,抽象類可以擁有任意范圍的成員數據,同時也可以擁有自己的非抽象方法,
- 但是接口方式中,它僅能夠有靜態、不能修改的成員數據(但是我們一般是不會在接口中使用成員數據),同時它所有的方法都必須是抽象的。
- 在某種程度上來說,接口是抽象類的特殊化。
- 對子類而言,它只能繼承一個抽象類(這是java為了數據安全而考慮的),但是卻可以實現多個接口。
3.2 設計層次
1. 抽象層次不同
抽象類是對類抽象,而接口是對行為的抽象。抽象類是對整個類整體進行抽象,包括屬性、行為,但是接口卻是對類局部(行為)進行抽象。
2. 跨域不同
抽象類所跨域的是具有相似特點的類,而接口卻可以跨域不同的類。我們知道抽象類是從子類中發現公共部分,然后泛化成抽象類,子類繼承該父類即可,但是接口不同。實現它的子類可以不存在任何關系,共同之處。例如貓、狗可以抽象成一個動物類抽象類,具備叫的方法。鳥、飛機可以實現飛Fly接口,具備飛的行為,這里我們總不能將鳥、飛機共用一個父類吧!所以說抽象類所體現的是一種繼承關系,要想使得繼承關系合理,父類和派生類之間必須存在"is-a" 關系,即父類和派生類在概念本質上應該是相同的。對于接口則不然,并不要求接口的實現者和接口定義在概念本質上是一致的, 僅僅是實現了接口定義的契約而已。
3. 設計層次不同
- 對于抽象類而言,它是自下而上來設計的,我們要先知道子類才能抽象出父類,而接口則不同,它根本就不需要知道子類的存在,只需要定義一個規則即可,至于什么子類、什么時候怎么實現它一概不知。比如我們只有一個貓類在這里,如果你這是就抽象成一個動物類,是不是設計有點兒過度?我們起碼要有兩個動物類,貓、狗在這里,我們在抽象他們的共同點形成動物抽象類吧!所以說抽象類往往都是通過重構而來的!
- 但是接口就不同,比如說飛,我們根本就不知道會有什么東西來實現這個飛接口,怎么實現也不得而知,我們要做的就是事前定義好飛的行為接口。所以說抽象類是自底向上抽象而來的,接口是自頂向下設計出來的。
語法規范區別:
1)接口不能有構造方法,抽象類可以有。
2)接口不能有方法體,抽象類可以有。
3)接口不能有靜態方法,抽象類可以有。
4)在接口中凡是變量必須是public static final,而在抽象類中沒有要求。