介面與抽象類,區別以及使用場景
阿新 • • 發佈:2018-12-08
順便做個記錄
介面和抽象類應該是Java語法中最常見的兩個概念
關於兩者,網上也是一搜一噸的對比,總體如下:
1,抽象類的成員可以具有訪問級別 介面的成員全部public級別2,抽象類可以包含欄位 介面不可以
3,抽象類可以繼承介面 介面不能繼承抽象類
4,抽象類的成員可以具有具體實現 介面不行
5,抽象的子類可以選擇性實現其基類的抽象方法 介面的子類必須實現
6,介面是抽象類的一種特例!
概念雖然簡單
不過到具體使用場景中,什麼情況下用抽象類,什麼情況下用介面呢,很多人卻搞不明白
下面我舉個例子
有一個Door,裡面有方法open()和方法close()
我們要把他抽象出來,形成一個類,可以有下面兩種方法
1,抽象成抽象類,如下
abstract class Door{
void open() {}
void close(){}
}
interface Door{
void open();
void close();
}
看起來兩者好像沒啥區別,現在我們要加一個功能,門鈴功能
沒啥問題,那就加上
1,抽象類
abstract class Door{ void open() {} void close(){} void bilibili(){} }
2,介面
interface Door{
void open();
void close();
void bilibili();
}
那麼問題來了,所有門都有開關門功能,是不是所有的門都有門鈴呢?
那不是所有的實現Door的類都得具有門鈴方法?
所以,我們應該把門鈴理解成一種附件,一種Attach,可以加到門上面的一種點綴
對於這種附件形式的類,我們就可以用介面來表示
所以,啥叫介面,就是在門上鑿出一個門鈴大小的洞,用來放門鈴的,就跟電腦上的usb介面一樣,一個洞嘛!
我們就可以這樣來定義鈴聲這樣一個介面
interface Ring{
void bilibili();
}
這樣定義Door這個類
abstract class Door{
void open() {}
void close(){}
}
這樣,如果有一個鈴鐺的門,可以這樣來寫:
class DoorWithRing extends Door implements Ring{
public void bilibili() {
// TODO Auto-generated method stub
}
}
如果是一個沒有鈴鐺的門
class DoorWithRing extends Door{
}
買個貓眼:
interface CatEye{
void see();
}
class DoorWithRingAndCatEye extends Door implements Ring,CatEye{
public void see() {
// TODO Auto-generated method stub
}
public void bilibili() {
// TODO Auto-generated method stub
}
}
一個門上可以打無數的洞,也就是可以實現多個介面!
有人會問,門鈴,貓眼,這些東西不也是類嗎,為啥不做成類,做成介面呢?
對的,當然可以做成一個正常的類,有他的屬性什麼的,這樣貓眼,門鈴和門的關係就變了,變成聚合關係了,不是組合,因為門沒了門鈴和貓眼還是門,這些基本的概念有機會再延伸吧
所以,對於那種功能單一(響鈴,看人),又需要拿來作為一個附件附加到基本類上的類,我們就把它定義成介面
ok!