java當中繼承一個接口,要重寫他的方法的話,那為什么還要多此一舉的去實現一個接口呢?
直接把方法寫在類當中不就可以了?
就是說去掉類名后面的Implements 接口 ,可以不可以呢?
接口的最主要的作用是達到統一訪問,就是在創建對象的時候用接口創建,【接口名】 【對象名】=new 【實現接口的類】,這樣你像用哪個類的對象就可以new哪個對象了,不需要改原來的代碼,就和你的USB接口一樣,插什么讀什么,就是這個原理。就像你問的,都有個method1的方法,如果我用接口,我上面就可以one.method1();是吧?那樣我new a();就是用a的方法,new b()就是用b的方法
這樣不方便嗎?
這個就叫統一訪問,因為你實現這個接口的類的方法名相同,但是實現內容不同。
另外java用接口還有一個好處,就是java不支持多重繼承,但是可以實現多個接口,這個在某種程度上可以看做進行多重繼承的一種辦法。
首先這樣寫是肯定沒有錯誤的,在我們初期學期的時候還沒有體現到接口的價值。但是當我們在做項目時,運用接口以后會很方便。因為接口里面只有簡單的方法的聲明。或者一些公用的東西。大家都去實現它的話比每次重新定義要方便很多。
對於接口的作用,在一些小的項目上,很難看出其發揮的優勢。這就使一些經常的做小項目的開發人員,做時間久了就感覺不到它有什么好的,有時候寫起來還麻煩,干脆不用了。其實,在一些大項目上,接口的作用是發揮地相當的明顯的。
比如:如果你開發業務邏輯代碼,當你好不容易的實現了它全部的功能,突然用戶需求要改,你在修改你代碼的同時,調用你代碼的其它人也會改,如果代碼關聯性
強的話,會有很多人都要改動代碼,這樣一來二去,程序會變得相當的不穩定,而且可能還會出現更多的新Bug,所有人都可能會陷入混亂。
但如果使用接口的話,在你使用它之前,就要想好它要實現的全部功能(接口實際上就是將功能的封裝)。確定下這個接口后,如果用戶需求變了,你只要重新寫它
的實現類,而其它人只會調用你的接口,他不管你是怎么實現的,它只需要接口提供的功能。這樣,很可能只需要把你的代碼修改就可以了,其他人什么都不用做。
同時:這樣做的話,使得開發人員能夠分工明確,只要確定下來接口了,就可以同時進行開發,提高開發效率。另外,使用接口還有使用方便,可讀性強,結構清晰
等優點。
定義一個接口,可以有多種實現。變量聲明為接口變量,調用接口方法,以后切換實現類的時候,原有代碼不用修改。
解耦,可擴展這是設計接口的主要原因之一
為什么接口可以多繼承,而類不可以?
如果有兩個父類,兩個父類里有一個相同的方法,那么作為子類應該怎么繼承這個方法?父類1的還是父類2的?
但是實現多個接口則沒問題,因為不管哪個接口,調用的都是同一個實現,因為只有方法名!
而且單繼承的目的之一,就是降低復雜度,減少維護難度
繼承:描述事物的自然屬性和行為的復用。
接口:描述事物的社會屬性和行為的復用。
因為繼承父類包括實現,繼承接口只包括接口,就是這樣。
接口定義的是行為,比如走,很多對象都可以實現這個行為
但類定義的是對象的屬性和具體行為
class 負責實現, interface負責接口;多繼承最麻煩的問題就是沖突, 沖突主要體現在 實現的時序和傳入參數, 傳出參數這幾個方面對於實現來說,父類發生時序問題時,使得語言本身變得無比復雜,而多繼承問題在實現本身是可以通過很多方式解決的, 而對於接口來說,傳入參數沖突是overload,則不是問題, 只有傳出參數這個問題是接口多繼承不允許的例如:
public interface IA {
void doSomething();
}
public interface IB {
Integer doSomething();
}
public interface IAB extends IA, IB {
@Override
public void doSomething();
@Override
public Integer doSomething();
}
這種情況編譯器會告訴你, IA, IB 接口沖突,是不允許的