java為什麼要設計interface,是為了儘可能替代類的繼承嗎?

諾壓壓壓壓壓最有愛的說丶


interface是接口的意思。接口意味著一種契約,相對於類而言接口的抽象程度更高。接口更多的是抽象出統一的行為,是約定;而類的繼承是複用,兩者的功能和定位有區別,是互補的。

接口定義了某些行為,而實現某個接口就必須實現這些行為。換句話說,某個類實現了接口,就必定具備接口所約定的功能。這樣的話,我們就可以採用面向接口編程的方式進行設計。我們看不到具體的類的實現,也不需要看到。我們只需要看到接口就可以了,然後就可以根據接口所提供的功能進行調用。

更具體的推薦看下java 編程思想。


程序員術與道


你好,你的問題包含了兩個小問題,①java設計interface的原因?②是不是為了儘可能替代類的繼承?

接口與繼承分別是什麼?(定義)

接口是一系列方法的聲明,比如方法名、參數、返回值等信息,接口中的方法不實現,這些方法可以在不同的地方被不同的類實現。

繼承就是子類繼承父類的特徵和行為,使得子類具有父類的實例域和方法。

接口與繼承的設計原因是什麼?(用處)

接口的主要作用在於降低代碼的耦合度,屏蔽實現層,比如前後端接口交互的時候,大家約定好接口層就可以互不影響的幹活了,至於接口實現後端可以慢慢做。

繼承的主要作用在於,在已有基礎上繼續進行功能的擴充①清晰體現相關類間的層次結構關係②減小代碼的冗餘度,大大增加程序的重用性。

接口與繼承有什麼區別?

①定義的修飾符不同(interface),(extends)

②接口中只能定義全局常量和抽象方法,而在繼承中可以定義屬性方法,變量,常量等。

③接口被類實現時,在類中一定要實現接口中的所有方法,而繼承可以調用指定方法。

④繼承只能繼承一個類,但implements可以實現多個接口,用逗號分開就行了 。

綜上所述,java中接口與類繼承各有自己存在的原因,有自己的適用場合,有區別也有一定的聯繫,可以根據自己的具體需求來選擇。


IT牛哥


明顯不是。你的問題本質是面向對象的問題,我當年上大學,只知道書中說有好處,但也沒搞明白到底哪裡好了。工作幾年才徹底明白。

如果你明白接口和類的本質區別,這個問題就自然明白了。類是一個範疇的東西,你是一個人,還是一個動物,是一個具體的什麼動物,貓還是狗,這就是類。頂層的動物是抽象的東西,而底層的貓啊狗啊是具體的東西。也就是說類是屬於某個範疇的東西,這個範疇相對明確,雖然也有一定的抽象。

而接口呢,是一個標準,一個規範,實現了這個接口,就意味著肯定有了相應的功能。這就是我們經常提到的實現一個接口,必須要實現接口中的所有方法。怎麼理解呢?我不管你屬於什麼類,貓啊,狗啊之類的,你只要實現了我的alive(活著)接口,我就知道你肯定有吃eat(),喝drink(),拉crap,撒pee()這些方法。接口不關係你是什麼類,它關心的是隻要是實現了這個接口,肯定會實現接口中的方法,也就是說有了相應的功能。

說了這麼多,在具體實踐中如何運用呢?我舉個實際例子來說吧,JDBC驅動,數據庫有好多種,mysql,oracle,等等,那麼作為程序員連接不同的數據庫,是不是寫的代碼不一樣呢?比如連接mysql用方法connectMysql()而連接oracle用方法connectOracle?這時候,接口的作用就體現出來了。我剛才說,接口是一種規範,一種標準,那麼我定義一系列的接口,別管你什麼mysql,oracle之類,要連接數據庫,都需要實現我定義的接口,並實現connect方法;包括取數據庫之類的,也是一樣的。用接口來處理這種標準,不管具體的數據庫是什麼。

在看看jdk自身的類,HashMap和HashTable,他們不是一個範疇:一個是Map,一個是Dictionary,但是他們都實現了Map接口,所以他們的功能或者能力基本相同。

那麼回到你的 問題本身,類繼承幹嘛用的呢。其實這源於一種設計思想:面向抽象編程,比如我剛才提到的,你的程序中有狗,貓,還有 人這些類,他們肯定有相識的東西,你如果面向具體編程,那麼貓和狗肯定有些功能或者代碼是重複的,比如吼叫bellow(),那麼完全可以抽象出來,把bellow這個方法放到貓和狗的父類,避免代碼重複或者耦合,你要考慮如果有100個貓或者狗之類的類,如果不 放到父類中,修改這個bellow方法可能涉及100個類。

仔細琢磨琢磨吧,我也是思索了好多年才體會出來的。讓你寫一個程序,如果你能熟練且正確運用接口,類,繼承等,說明你真的有了面向對象思想了。


分享到:


相關文章: