1. 程式人生 > >【知了堂學習筆記】java 接口與抽象類

【知了堂學習筆記】java 接口與抽象類

表現 lar images 例子 然而 編寫 targe 無法 abstract

本次主角:抽象類 、接口。

對於皮皮瀟這樣一類的Java初學者來說,接口和抽象類如果不去花大量的精力與時間是很難弄清楚的,而我也是在最近這周的項目學習中感覺到了我對這兩個概念不熟悉,所以導致對一些問題不能理解清楚,然後就去查閱資料對抽象類接口做了一些總結。

1.抽象類:

  抽象類的建立,實在抽象方法之後的,所以想要了解抽象類得先了解抽象方法,抽象方法由名字可以知道它是一種特殊的方法,是抽象的,只有方法的聲明,沒有具體的實現。所以不能看到它的功能,表現得就很抽象。

  抽象方法必須要用abstract關鍵字來修飾,其聲明格式為 abstract void f();所以如果一個類含有一個抽象方法就稱這個類為抽象類,抽象類也必須用abstract關鍵字來修飾。

  這裏有一個值得註意的地方就是一個類不包含抽象方法,但是被abstract關鍵字修飾,那麽這個類也是抽象類。抽象類裏面也不是只能有抽象方法,也能有普通方法。同樣也能有成員變量,

  由於抽象類裏面的抽象方法不能具體實現,所以為了解決這個問題用到了繼承。而且子類必須覆蓋父類所有的抽象方法,這個子類才能被實例化,否則這個子類也必須用abstract來修飾。

具體代碼:

//這裏就是定義了一個抽象類Demo,然後讓其子類Demo1去繼承它,下面子類的方法完全覆蓋父類的方法所以編寫時不會報錯。
package
suanfa; abstract class Demo { abstract void
show(); abstract void pi(); } class Demo1 extends Demo { void show() { } void pi() { } }
//然而我將子類的pi方法註釋了後,eclipse中就會出現以下錯誤,會告訴你必須實現pi這個方法。
技術分享
package
suanfa; abstract class Demo { abstract void show(); abstract void pi(); } class Demo1 extends Demo { void show() { }
// void pi() { // } }
//當然這裏我將Demo1寫為abstract的,也不會出現錯誤
package
suanfa; abstract class Demo { abstract void show(); abstract void pi(); } abstract class Demo1 extends Demo { void show() { } // void pi() { // } }

抽象類和普通類的主要區別:

①:抽象方法不能被private修飾,因為private修飾的方法子類無法覆蓋。

②:抽象類不能創造對象。

③:如果一個類繼承抽象類必須實現抽象類裏面的所有方法,如果子類沒實現抽象類的所有方法,則子類也必須用abstract關鍵字修飾為抽象類。

2.接口:

接口是一系列方法的聲明,可以理解為一個存放方法的集合。接口只有方法的特征,不能具體的實現方法,所以接口裏面的方法都是抽象方法。這些方法可以在不同的地方被不同的類實現。

允許一個類遵循多個特定的接口。

接口是一個極度抽象的類型。

3.接口與抽象類的區別

①:抽象類可以提供成員方法的實現細節,而接口中只能存在public abstract方法;

②:抽象類的成員可以是各種類型的,接口中只能是public static final類型的;

③:接口中不能有靜態代碼塊和靜態方法,抽象類中可以有。

④:一個類只能繼承一個抽象類(一對一),一個類可以實現多個接口(一對多);

舉例:

抽象類是對事物的抽象,即對類抽象,而接口是抽象行為,對動作抽象。

如:狗和貓都有共同的行為跑,那麽可以將夠設計為一個Dog類,貓設計為一個Cat類,但是不能將Run設計為一個類。此時可以將Run放入一個接口中,然後Dog與Cat都可以去實現Run這個接口,裏面有run()這個方法,然後dog裏面的小狗,大狗不同的類型,直接繼承Dog這個類就好了。這裏就可以看出,接口裏面我只需要有跑這個動作的類都可以實現Run這個接口。

抽象類是模板設計,而接口是行為規範。

這裏有一個網上找門和警報的例子:

門都有open()與close()這兩個動作,則可以定義一個抽象類Door或者一個Door接口來放置這兩個方法:

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

或者:

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

但是後面我們需要加入報警這個動作進來,

如果我們將報警alarm()也放入Door這個類中則會發現,我們所有的門都賦予了報警的功能,實際上我們有些門是不能報警的。

如果我們將alarm(),open(),close()這三個動作都放入Door這個接口中,會發現我們需要用到報警這個功能的時候,接口中的open()與close()這兩個方法也被實現了

所以這裏就可以看出alarm()與open()、close()完全是兩個不同範疇的行為,open()、close()是門固有的行為,alarm()是後來加入的行為。所以最好的解決方法是將open()、close()這兩個行為放入Alarm類中,將alarm()單獨放入一個接口中。再設計一個報警們繼承Door類和實現Alarm這個接口。

abstract class Door{
    public abstract void open();
    public abstract void close();
}
interface Alarm{
    public abstract void alram();
}
class AlarmDoor extends Door implements Alarm{

    public void alram() {
    }
    public void open() {
    }
    public void close() {
    }
    
}

www.zhiliaotang.com 請關註知了堂,這裏有太多好學的程序員,加入我們,一起嗨皮,共同學習。

【知了堂學習筆記】java 接口與抽象類