首頁  >  文章  >  Java  >  Java基礎——抽象類別和接口

Java基礎——抽象類別和接口

巴扎黑
巴扎黑原創
2017-06-26 11:31:071331瀏覽

之所以將抽象類別和介面放在一起做筆記,是因為他們之間很難區分又各自獨立。在學習完Java程式設計的三大特點(封裝、繼承、多態)之後,我最大的收穫是,慢慢了解Java語言這種物件導向程式設計的優越性,它既能保持自身獨立性又在不斷進化、發展的。如果說封裝和繼承是實現Java多態性的基礎,那我個人覺得抽象類別和介面更是為多態提供了非常好的支援。

一、抽象類別

從形式上來說,用abstract修飾的類別就是抽象類別。抽象類別是不完整的,只能做基底類,且不能夠實例化(不能new)。

通俗來講,抽象類別它本身不做任何事情,它是去要求別人來實現它的規範的。它定義了一組抽象的方法,至於這組抽象方法的具體表現形式有衍生類別來實現。抽象類別的實作要用到繼承,不然你造出來它就沒有意義。

使用抽象類別必須注意以下幾點:

1.抽象類別只是一個引用而已,不能被實例化,實例化的工作要交給它的子類別;

2.抽象方法必須由子類別來進行重寫;

3.在一個類別中,只要有一個方法被定義為抽象方法(被abstract修飾了),那麼這個類別就必須被定義為抽象類別(類別名稱也要被abstract修飾);

4.抽象類別中可以包含具體方法,也可以不包含;

1 public abstract class ChouX {2     public abstract void method1();3 4     public void method2() {5 6     }7 }

5 .子類別中的抽象方法不能與父類別的抽象方法同名;

6.abstract不能與private、static、fanal或native並列修飾同一個方法。

程式碼實例:

//抽象类public abstract class Animal {public abstract void shout();
}
1 //猫子类2 public class Cat extends Animal {3     public void shout() {4         System.out.println("喵~~");5     }6 }
#
//Dog子类public class Dog extends Animal {public void shout() {
        System.out.println("汪汪汪。。。");
    }
}

 

//测试类public class Test {public static void main(String[] args) {
        Animal a1 = new Dog();
        Animal a2 = new Cat();
        a1.shout();
        a2.shout();
    }
}

#Output :

二、介面

#對於物件導向程式設計來說,抽像是它的一大特徵。在java中,可以透過兩種形式來體現OOP的抽象:抽象類別和介面。

介面(interface),在軟體工程中,介面泛指供別人呼叫的方法或函數。

格式:

[public] interface InterfaceName{

}
<span style="color: #0000ff;"><span style="color: #99cc00;">//例子</span><br>interface</span><span style="color: #000000;"> Door{</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">abstract</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> open();</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">abstract</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> close();
}</span>

#要讓一個類別遵循某組特定地介面需要使用implements關鍵字。

格式:

class ClassName implements Interface1,Interface2,Interface3....{}(允許一個類別遵循多個特定的介面)

三、抽象類別和介面的區別

1.語法層面的差異

首先,抽象類別可以提供成員方法實作的細節,而介面中只能存在public abstract 方法;

其次,抽象類別中的成員變數可以是各種類型的,而介面中的成員只能是public static final類型的;

再者,介面中不能含有靜態程式碼區塊和靜態方法,而抽象類別可以;

最後,一個類別只能繼承一個抽象類別,而可以繼承多個介面。

2.設計層面上的差異

首先,抽象類別是對一種事物的抽象,即對類別的抽象,而介面是對行為的抽象。

再者,抽象類別作為許多子類別的父類,它是一種模板式的設計。而介面是一種行為規範。

最後,在一個抽象類別中,如果你想更改一個方法,可以直接在抽象類別中實現,子類別可以不進行更改。而這種事情發生在介面上,那麼所有連結這個介面的類別都需要更改。

總結:說了這麼多,其實原理只要想通了還蠻簡單的。對於抽象類,就比如說,你定義一個抽象類,來做父類。你有可能對一個類別的描述就沒寫全,或者它幾年以後升級換代了。那也總有保留的吧。這時候你不必大動乾戈把整個父類統統推翻,你只需要在子類中填上具體的更改的方式就可以了。想改什麼不改什麼,什麼時候改都由你自己決定。這樣靈活性、重複使用性是不是就高了。而抽象類別與介面的區別,就像魚和船都能在水裡遊吧,那他們也不是同一個類別啊。你也就別想著把魚和船劃到一個類當中,但是這個「遊」的動作是它們都有的,我們就把這個「遊」的動作設定成一個接口,魚能用,船能用,將來你想描述任何會「遊」的事物的時候都可以用上它。

網路上有個很有取的案例:

可以好好思考一下,方便形象理解抽象類別和介面的差別。

1 //接口2 interface Alram{3   void alarm();4 }
1 //抽象类2 abstract class Door{3   void open();4   void close();5 }
1 //报警门最后的设置2 class AlarmDoor extends Door implements Alarm{3   void open(){4   }5   void close(){6   }7   void alarm(){8   }9 }

以上是Java基礎——抽象類別和接口的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn