2013-09-29 409 views
1

代碼和接口爲什麼在java中需要接口?

/* FileName : cat SampleInterface.java */ 
public interface SampleInterface 
{ 
     public void draw(); 
     public void color(); 
} 

代碼和抽象方法

/* FileName : SampleAbstractMethod.java */ 
abstract class SampleAbstractMethod 
{ 
     public abstract void draw(); 
     public abstract void color(); 
} 

在哪些方面是他們倆有什麼不同?

當然,肯定會有很大的差異,如果抽象方法足夠的話,Java開發人員不會引入接口。的事情,我在共同看到的是

  1. 兩個不能有定義,就像我的代碼已經發布。

  2. 繼承或實現類將不得不引入定義。

現在據我看到它抽象方法可以做什麼接口可以,那麼爲什麼有接口?,有什麼特別之處,一個抽象方法不能做的界面?究竟是什麼原因需要和接口?

編輯:我的問題是關於抽象方法和接口,而不是abstract classes其重複的鏈接指向我之間的差異。所以請解釋我的問題與標記的重複相似。

+0

上面列出的前兩個問題都是關閉的,但我認爲這個問題重複了這個問題:[Interface vs Abstract Class(general OO)](http://stackoverflow.com/questions/761194/interface-vs-abstract -class-general-oo) –

+1

與抽象類相比,接口的一個主要缺點是如果你想更新接口,它會破壞以前提到的那個接口的現有代碼.. – Anirudha

+0

抽象方法可能有實現,但接口方法只有方法簽名 –

回答

1

你的問題是關於抽象方法和接口之間的區別。但我認爲你忘記了一個界面中所有方法都是抽象的東西。所以在一個接口和一個摘要中的方法是相同的。

好,需要一個接口實現多重繼承的需要。 當您需要創建具體類時,使用抽象類,但要確保在所有子類中都有一些共同的狀態,或者對於某些操作有一個可能的常見實現。

1

抽象類可能有非抽象方法,而接口只能有方法聲明。 在某些情況下,您需要一個具有某種功能的抽象類,但其子代必須實現其抽象方法。 一個類可以實現多個接口,但可以從1個抽象類繼承。

+0

事實上,我認爲抽象類是接口和具體類之間的一半 –

2

僅當存在「是」關係時才使用抽象類;接口可以通過類來實現,它們沒有任何共同之處。

抽象類可以實現方法;界面無法實現方法。

接口只能描述常量值和方法,但沒有實現它們。接口的所有方法默認爲public abstract,變量爲public static final

在Java類中可以繼承(實現)很多接口,但只能有一個抽象類。

對於抽象類,您失去了繼承它的類的個性。通過接口,您可以放大每個班級的功能。

接口的例子是「飛」:蝴蝶,鳥或飛機。 抽象類的例子是「遊戲」:足球,板球或國際象棋。

更新: 至於方法,你可以在接口和抽象類中都有抽象方法。你只需要選擇使用它們的地方。這個問題引導你去了接口和抽象類之間的區別。

+0

我的問題是關於'抽象方法'而不是'抽象類' – vikkyhacks

+0

@vikkyhacks抽象方法的概念是緊密的與抽象類相關聯,你不能無論如何,考慮一個沒有其他 –

+0

。 在我的回答中,我承認在接口方法默認情況下是'abstract'。所以你可以在接口和抽象類中使用抽象方法。所以現在你要選擇**在哪裏使用它們。這個問題引導你去了接口和抽象類之間的區別。 – Scadge

0

查看Oracle的官方文檔:http://docs.oracle.com/javase/tutorial/java/IandI/abstract.html(抽象類)和http://docs.oracle.com/javase/tutorial/java/IandI/createinterface.html(接口)。

這裏是在Stack Overflow約抽象類VS接口很好的討論:Abstract class vs Interface in Java

+0

我的問題是關於'抽象方法'不'抽象類' – vikkyhacks

+0

這個答案實際上是一個鏈接的集合。鏈接是很好的支持答案,但不應該是真正的答案 –

1

它的所有可能性;-)

在一個界面你只有做一個函數聲明的可能性。所以它以某種方式限制你甚至不能定義變量(常量可以)...

在抽象類中,你可以同時做兩個!你可以有和沒有源代碼的功能。你可以有變量等等......

最重要的是,你只能使用一個抽象類作爲父類,但只能使用許多父接口。

因此,它真的是一個你需要什麼的問題,以及你如何利用OOP概念。

如果你只是想減少代碼的確定,使用沒有想,但如果你想使更多的東西可靠閱讀更多關於Subtyping

相關問題