類,抽象類與接口
類,抽象類與接口都是Java中實現(xiàn)繼承和多態(tài)的手段.
類強調(diào)的是繼承
接口強調(diào)的是規(guī)范
抽象類兼而有之
什么是接口
接口是一種特殊的類,它只有方法定義而沒有實現(xiàn),實現(xiàn)的任務(wù)完全交給子類完成.
接口以interface標(biāo)志.
繼承接口用implements關(guān)鍵字實現(xiàn).
接口可以繼承接口.
接口可以有成員,但成員全是public static final類型的.
接口沒有構(gòu)造函數(shù).
接口給Java提供了多繼承機制
接口例子—Knockable
public interface Knockable{
public static final String Sound="Bang!";
public void knock();
}
接口例子-實現(xiàn)接口
public class Hammer implements Knockable{
public void knock(){
System.out.println(Sound);
}
}
接口例子-實現(xiàn)多個接口
public interface Knockable{
public static final String Sound="Bang!";
public void knock();
}
public interface Clampable {
public void clamp();
}
public class Pliers implements Knockable,Clampable{
public void clamp(){
// do sth
}
public void knock(){
System.out.println(Sound);
}
}
接口繼承接口例子
public interface Knockable{
public static final String Sound="Bang!";
public void knock();
}
public interface Hitable extends Knockable{
public void hit();
}
public class Stick implements Hitable{
public void knock(){
// do sth
}
public void hit(){
// do sth
}
}
什么叫抽象類
類中具有抽象方法的類為抽象類.抽象方法以abstract在函數(shù)前修飾,只有定義沒有實現(xiàn),這一點和接口一致.
抽象類在類名前需加上abstract修飾符以標(biāo)識.
抽象類不能生成實例.
抽象類的繼承性和類一致.
抽象類的實現(xiàn)
public abstract class Gun{
protected String cannon;
protected List<Bullet> bullets;
public abstract void shoot();
public void addBullet(Bullet bullet){
if(bullets==null){
bullets=new LinkedList<Bullet>();
}
bullets.add(bullet);
}
}
繼承抽象類
public class Rifle extends Gun{
public void shoot(){
// Shoot Sth
}
public void reload(){
if(bullets!=null){
bullets.clear();
}
addBullet(new Bullet());
addBullet(new Bullet());
addBullet(new Bullet());
addBullet(new Bullet());
addBullet(new Bullet());
addBullet(new Bullet());
}
}
繼承抽象類并實現(xiàn)接口
public abstract class Gun{
protected String cannon;
protected List<Bullet> bullets;
public abstract void shoot();
public void addBullet(Bullet bullet){
if(bullets==null){
bullets=new LinkedList<Bullet>();
}
bullets.add(bullet);
}
}
public interface Thornable{
public void thorn();
}
public class SpringFieldRifle extends Gun implements Thornable{
public void thorn(){
// thorn sth
}
public void shoot(){
// shoot sth
}
}
抽象類繼承抽象類實現(xiàn)接口的例子
public abstract class Gun{
protected String cannon;
protected List<Bullet> bullets;
public abstract void shoot();
public void addBullet(Bullet bullet){
if(bullets==null){
bullets=new LinkedList<Bullet>();
}
bullets.add(bullet);
}
}
public interface Handable{
public void hold();
}
public abstract class HandGun extends Gun implements Handable{
}
public class BlackStar extends HandGun{
public void hold(){
// Hold the gun
}
public void shoot(){
// Shoot Sth
}
}
抽象類,接口,類的區(qū)別
繼承好比家學(xué)淵源,所謂"忠厚傳家久,詩書繼世長",家長總會潛移默化的影響下一代,下一代也會在不經(jīng)意中學(xué)習(xí)前輩的特點,但因為年少分辨能力不高加上世易時移有些優(yōu)點已經(jīng)不再是有點甚至?xí)兂扇秉c,下一代會把前輩的優(yōu)缺點不分良莠的繼承下來.這也是日后出現(xiàn)問題的根源.
接口好比拜師學(xué)藝,"入了這個門,就得說這行話",比如相聲界說學(xué)逗唱四門是必須要學(xué)的,但是"師傅領(lǐng)進門,修行在個人",學(xué)得怎么樣還全看自己,指望不費力的繼承什么是不可能的,具體功夫還得個人來過. 因為是自己來,具體實現(xiàn)成什么樣自由度也很大,比如四門功課中的"唱",原指唱太平歌詞,但因為愛聽的少,現(xiàn)在相聲演員已經(jīng)不要求這個了,改為唱歌唱戲的唱,其實嚴(yán)格界定的話是"學(xué)"的一種.這也無所謂對錯,郭德剛堅持唱太平歌詞也行,笑林唱流行歌曲也不錯,總之實現(xiàn)了就可以,實現(xiàn)得怎么樣則留給實踐來檢驗.一個類可以同時實現(xiàn)多個接口,就和藝人拜幾個師傅是沒有問題的,郭德剛就同時實現(xiàn)了大鼓和相聲兩個接口.
抽象類則介于繼承和接口之間,既可不費力的從上一代繼承,也可強制實現(xiàn)某接口,有如某大師收自己的孩子為徒,當(dāng)然相聲界不讓這么干,其它曲藝行業(yè)還是可以的,比如京劇界的梅蘭芳和其子梅葆玖,既有言傳身教,也有強制實現(xiàn),綜合了繼承和接口的特點.
抽象類,接口,類的詳細(xì)區(qū)別
|
接口 |
抽象類 |
類 |
可以繼承自 |
接口 |
抽象類,類 |
抽象類,類 |
可以實現(xiàn)自 |
無 |
一個或多個接口 |
一個或多個接口 |
有否成員 |
只有static final成員 |
均可 |
均可 |
是否有構(gòu)造函數(shù) |
無 |
有 |
有 |
可否實例化 |
不可 |
不可 |
可 |
意圖 |
規(guī)范行為 |
繼承成員+規(guī)范行為 |
繼承成員 |
抽象類,接口和類在繼承體系中的位置
抽象類,接口一般來說都是從一般類總結(jié)歸納出來的抽象共性的東西,類則是實際具體的東西.
一般來說,應(yīng)該把合理抽象出的抽象類,接口放在類繼承體系的上層,子類依靠類來實現(xiàn).