今天看到項目中,寫了一個抽象類,里面有很多方法繼承了這類,當調用這個接口時,采用的是這個抽象類去調方法的,當時一想,這個不就是我們說的Java的多態的特征:
繼承:存在繼承關系的子類和父類
重寫:子類對父類的某些方法進行重寫(多態下調用的是子類重寫的方法)
父類引用指向子類對象:即向上轉型,將子類的引用賦給父類的對象
然后,我們調用的時候,就是通過父類的對象去調用方法的。但是,一想接口好像也可以實現多態,並不是抽象類才可以,我們只要多個類實現同一個接口,也可以實現多態,
因此,轉着轉着,就轉到了接口和抽象類的區別了。
接口
接口是一序列方法的聲明,一序列方法特征的集合,一個接口只有方法的形狀而沒有方法的具體實現,接口是Java面向對象提供的一種機制。
Java語言是一種單繼承的,在類的繼承中可以實現多個接口代替了多繼承
接口的申明:
public interface 接口類名稱{
}
抽象類
抽象類是描述許多類的公共的地方,它是一個基類,在項目中主要用作很多類的基礎類,比如對表中的增刪改查,我們可以抽取一個基類來,然后讓表結構的類去繼承它,這樣就省的我們去寫那些基本的增刪改查了
抽象類的申明:
public abstract 抽象類名稱{
}
接口和抽象類的區別
接口和抽象類還是有一定區別的,接口可以看做是抽象類的一種更抽象化,接口是對動作(行為)的抽象,抽象類是對類的抽象,簡單的來說,就是接口注重的是方法,而抽象類注重的是屬性和方法
接口:
方法完全抽象的,並且方法必須是public,如果寫成其他的編譯時會報錯,如果不寫,則默認方法是public abstract
子類用implements來實現接口,子類需要實現接口中的所有方法
接口不可以new操作符實例化一個接口,但可以聲明一個接口變量
接口可以繼承一個或者多個接口
接口可以有變量,但是這個變量是不可以變的變量,它會自動的變為public static final
抽象類:
可以有方法的實現,但是這個方法不是abstract方法
子類用extends來繼承抽象類,如果子類不是抽象類,則子類必須實現抽象類中的所有抽象方法,也可以實現抽象類中的非抽象方法
抽象類中可以有構造器
抽象類中可以有public,protected和default修飾符
抽象類可以繼承一個類和實現多個接口
總的區別是:
抽象類可以有構造函數,接口不可以有構造函數
抽象類中可以有普通成員變量,接口中沒有普通成員變量,只能有常量
抽象類中的方法可以被static修飾,接口中的方法不可以被static修飾
抽象類中可以有普通方法和抽象方法,接口中的方法全是抽象方法
抽象中的方法可以被public,protected等修飾符修飾,接口中的方法全都是public abstract的方法,如果省略修飾符,則默認的也都是public abstract修飾
一個類只能繼承一個抽象類,接口可以被多實現,即一個類只能繼承一個類,可以實現多個接口
什么時候使用接口,什么時候使用抽象類
如果你想擁有一些方法,並且這些方法有默認實現,那么久使用抽象類
如果你想實現多繼承,那么就是用接口吧,java不支持多繼承,但是可以實現多個接口
接口主要用於模塊與模塊之間的調用
抽象類主要用於當做基礎類使用,即基類
