2012-08-09 66 views
2

在一次採訪中,有人問我要證明什麼時候選擇界面,什麼時候選擇抽象類,以及在哪兩個條件中你只選擇兩個..我提出了我的分析爲接口,這是...選擇界面或抽象類

接口是多方之間的類型聲明或定義合同 的最佳選擇。 如果多個程序員在一個項目的不同模塊中工作,他們仍然通過定義接口來使用其他API,而不是等待 以使實際實現準備就緒。

這給我們帶來了很多靈活性和速度方面的編碼和 的發展。接口的使用還確保了最佳實踐,如 「編程接口比實現」,並導致更多的靈活和可維護代碼 。

但我沒有充足的理由證明抽象類,請指教..!

+0

可能的重複:http://stackoverflow.com/questions/2869222/use-of-java-interfaces-abstract-classes?rq=1 – blackcompe 2012-08-09 18:23:55

+0

抽象類具有類似的優點。 *編程接口並不等同於使用'interface' *,它也可以用抽象類來完成。使用抽象類的主要原因是提供一些可以由其所有子類共享的實現。這裏主要的限制是一次只能擴展一個類的能力。 – toniedzwiedz 2012-08-09 18:26:11

回答

21

抽象類用於在一個實體下對許多具體類進行分組。

例如,抽象類Animal。 動物不是具體的東西。這是一個動物家族。但他們都有一些特定的aspectes,例如,每個都有speak()選項(當然,除了魚和排序)。但每個人都以不同的方式實施。這樣你可以覆蓋只是不同的方法,例如sleep() or breath()是常見的(同樣,魚是不同的:))。

另一方面,接口更直接地定義'行爲'。這就是爲什麼大多數(如果不是全部的話)Java中的接口以'able'結尾(可比較,可序列化...) 通過實現接口,你告訴其他程序員或者誰曾經使用過你的代碼,這個類可以做到這一點,這個。例如,一條狗不是可以動畫的。

基本上,總結起來,我認爲最好的定義是這樣的。 當你有一個類A is kind of B和界面A can do B時使用抽象類。

希望這是幫助。

+0

你偷了我的動物的例子,但我真的很喜歡你的關閉句。 +1對其進行簡要總結。 – Petrucio 2012-08-09 18:34:11

+0

我很確定Java庫中的大多數接口不會結束'able'。 「有點」vs「可以做到」讓我覺得自己是文字遊戲。 – 2012-08-09 18:38:32

+0

@Petrucio,對不起。沒有看到。這是我大學最廣泛使用的例子。湯姆霍金,我不明白你想說什麼。至於我所用過的「最有能力」呢。 Runnable,Comprable,Serializable。這是我試圖傳達的。 – 2012-08-09 18:48:36

5

當您想要提供部分實現時,將使用抽象類。

+0

爲了OP的緣故,可能需要更多的澄清。 – 2012-08-09 18:23:39

+0

@丹尼斯我給他的主要原因是,如果他自己做出來的話,他會受益更多。 – Lanaru 2012-08-09 18:28:19

+0

我想我不能與此爭論。 – 2012-08-09 18:29:33

1

一個接口用任何實現來聲明一個契約。這是該類將包含界面中的方法的保證。

一個抽象類是相似的,任何它的子類也必須實現抽象方法,但是你也可以在其中有代碼的工作方法。

我在Android編程中使用了很多接口。抽象類我使用了很多,如果我有很多類似的數據要顯示,只需要對實現進行小改動。使用抽象類來減少重複的代碼,同時仍然有不同的實現。

+0

java.sql具有可能包含未實現方法的接口。在Java SE 8中,您將能夠在接口中使用工作方法代碼。 – 2012-08-09 18:34:57

2
  • 如果需要,抽象類可以具有默認行爲(實現),接口不能。

  • 抽象類可以爲所有方法提供默認行爲,或者不提供方法,而接口不能。

  • 抽象類可以具有與所有子類共享的狀態,接口不指定狀態。

  • 你可以實現多個接口,你只能擴展一個(抽象)類。

+0

從Java SE 8開始,接口可以具有默認實現。 – 2012-08-09 18:35:30

1

您對接口的定義是正確的。

抽象類應該服務於完全不同的目的。作爲一個例子,假設您正在爲動物模擬器實施幾個類。 '動物'定義了幾種可能已經具有基本實現的行爲,但本身並不是有意實例化的東西。同樣的'Mamal',一個'動物'的泡泡。只有一個「老虎」的子類不會是抽象的,但是大多數老虎所做的並不是老虎特有的東西,它們將在抽象的超類中實現。

0

如果一般來講,一個Abstract class會,當我們需要強制了一些功能上的Sub-ClassSuper-Class讓子類有靈活地添加其他functinality需要。

如:

Let Car be the Abstract Super-Class, which has 4 Tyres, 1 Steering ,etc...

Now the Sub classes like Santro i10, Maruti-800, Mahindr Bolero etc are Sub classes, but they need to have 4 Tyres, 1 Steering to be called a car, not they can have a radioor not as an additional feature.

2.Interface在java中被引入,因爲沒有多重繼承。

3.Interface更多關於提供role

如:

Let Dog be the Super-Class

Wild Dogs and Pet Dogs are Sub-Classes.

Wild Behavior and Pet Behavior are Interfaces

Now as both Wild Dog and Pet Dog are dogs, but with different behavious. Then they mustimplement the Wild Behavior or Pet Behavior respectively

0

你想要當你想你的類使用抽象類來實現的是方法,如果情況將要求他們。

一個例子就是如果你有一輛超級車,並且你希望你的小班給你一些車輪,如果他們有的話。如果他們是小船,你就不需要他們,所以合同會迫使你繼續執行,而你可能會忽略它,因爲你的抽象類。