我是一個Java小白所以懇請原諒我,如果這個問題太簡單或太複雜,但我一直在經歷着我的Java的書,並在第一章中,我們覆蓋的傳承,後來我們來到了接口。java:何時使用接口以及何時重寫?
我的問題是: 當正確使用的界面,當是正確重寫方法呢?
由於我們已經有重寫功能,爲什麼我們需要接口?
我是一個Java小白所以懇請原諒我,如果這個問題太簡單或太複雜,但我一直在經歷着我的Java的書,並在第一章中,我們覆蓋的傳承,後來我們來到了接口。java:何時使用接口以及何時重寫?
我的問題是: 當正確使用的界面,當是正確重寫方法呢?
由於我們已經有重寫功能,爲什麼我們需要接口?
看一看這個頁面:http://www.javaworld.com/javaworld/javaqa/2001-04/03-qa-0420-abstract.html。它解釋了一些差異,以及何時應該使用每個差異。
或者這一個:http://www.javabeginner.com/learn-java/java-abstract-class-and-interface。我認爲這個更好。
我已經讀過,你應該回答沒有鏈接時儘可能避免鏈接腐爛。 –
把它看成是這樣的:考慮一個汽車類,用作基礎幾類像皮卡,小型貨車和SUV,在那裏你覆蓋小車 - 方法。
到目前爲止,這麼好。
但是在現實生活中,一輛車不僅僅是一輛汽車。例如,它也是一個身體。因此,根據您的應用程序,你需要看一下飛機,汽車,也許其他一些事情只是肉體,誰所有有共同興趣的東西,例如:
double getMass();
double getVelocity();
與此同時,汽車不僅僅是一個實體,也是家庭資產。例如,它可能與貸款有關。因此,你可能想支持像方法:
Loan getLoan();
因此,接口可將通知送達不同的類的對象提供一定的意見,如果這些對象有相同的類型。
接口提供某種類型的合約,該類應實施。 假設您有一個名爲Car
的接口,它有一個accelerate()
方法。這裏沒有實現。
現在,你想要的Car
一些真正用途,所以你創建一個SubaruCar
類,它實現accelerate()
方法。
現在,如果您例如需要SubaruImpreza
類,則它可能會使用繼承和關鍵字extends
擴展SportCar
。在這個類中,你覆蓋accelerate()
方法(因爲它會加速更快再平常SubaruCar
)
淨是充滿單證regaring這個問題,但如果我嘗試summerize它在簡單的英語比:
接口 - 這就像一個說「我可以提供這種功能」的合同。 接口示例:Comparable
這意味着任何類似的對象都可以提供比較的功能
Overreid - 當您使用吸入性功能並希望某些功能在兒童班級中採取不同的行爲時。
這是兩個不同勢的問題,關於beggining可能有點難以理解
其他在這裏都取得了不錯的點,但讓我提供一個稍微不同的觀點。
如果你有對象中常見的行爲(不是代碼或特徵,介意你,但是實際行爲),請考慮一個在方法中有一些已建立行爲的抽象類(可能聲明爲final
)。不過要小心。查看Circle-Ellipse problem,看看爲什麼Circle可能不應該繼承自Ellipse,即使這似乎很明顯。
你只能擴展一個類,所以要做一個好的。請記住,雖然好的軟件設計是儘可能鬆散地耦合代碼。換句話說,儘可能確保在一個類中更改代碼並不涉及改變一堆其他類中的代碼。這就是爲什麼在週末工作的原因。 比繼承沒有更緊密的耦合,所以明智地選擇。向基類添加新行爲意味着每個派生類都可以獲得它,並且這可能會導致很多尷尬的問題(例如,通過實現一個空方法來滿足合同)解決了這個問題。
最後,延長多個接口的能力允許客戶機代碼不同,根據不同的API契約來治療的對象,所以能治療Person
對象作爲在代碼中的一個部分Doctor
和在的另一部分的Father
代碼。但請不要誤解,這是而不是的多重繼承。
最後,它取決於您的域名,基本類別更改的可能性以及您將學習用經驗衡量的其他因素。所有的事情都是平等的,喜歡接口繼承。
並等待,直到你學習Ruby和Scala,並且瞭解了模塊和特性。然後它變得非常有趣。
希望有所幫助。
你不能使用接口和覆蓋方法進行比較。這些是兩個不同的東西 –