2017-06-01 42 views
29

由於Java 9將允許我們在接口中定義privateprivate static方法,因此interfaceclass的剩餘差異是什麼?另外,Java是否正朝着多重繼承緩慢發展?Java 9接口vs類

+26

我很驚訝,有這麼多upvotes ...剩餘的區別:'protected'支持,'package-private'支持,**基本上除了'private'和'static' **外所有內容。接口不能擴展類,保留關鍵字'interface'和'class ',*兩者的存在理念/目的/理由..可能繼續下去.. –

+4

@VinceEmigh我明白你的關注。但是在我職業生涯剛開始的時候有人告訴我:「沒有問題是愚蠢的」。而且我知道所有包括你在內的人都會理解這一點。 – Aakash

+3

答案仍然與[默認方法與Java 8中的抽象類的接口](https://stackoverflow.com/q/19998454/2711488)中的相同,只是在接口中可以有'private'方法,這顯然不會對其他班級產生影響。 – Holger

回答

35

Java 9中的私有接口方法的行爲與其他私有方法完全相同:它們必須具有正文(即使在抽象類中),既不能被子類調用也不能被子類重寫。因此,它們並不真正與繼承進行交互。其中(特別是多重繼承)的聊天,有(至少?)三種的它:

  • 的類型繼承意味着一個類型可以是另一種類型,例如StringObject。 Java允許從第一天開始通過類型的多重繼承(通過接口)。
  • 行爲的繼承意味着一種類型可以繼承另一種類型的行爲。在Java 8之前,只有類可以實現方法,所以只有這種類型的單一繼承。使用Java 8的默認方法,允許接口實現方法,從而爲Java提供多重行爲繼承。
  • 繼承狀態意味着一個類型繼承另一個類型的內部狀態(即字段)。就目前而言(Java 9和當前爲未來的Java版本提出的一切),只有類可以具有狀態,因此只有這種類型的單一繼承。

正如你所看到的私人界面方法不會在這裏添加任何東西。

關於如何比較接口和類的問題,有兩個主要區別:多重繼承和狀態。接口支持前者,類可以具有後者。由於國家在典型的面向對象方面很重要,所以類仍然是相關的。

如果有一種方法讓接口強制實現具有特定的非公有領域或者直接定義一個接口本身,則遊戲會發生變化,接口可能會與類競爭。

+0

這不是很漂亮,我不想看到它生產,但不能用一個內部類來封裝狀態來模擬多個類的繼承?與此類似:https://stackoverflow.com/questions/3427073/java-interface-implementation-pair/3442218#3442218 – Terran

+0

由於內部類以及引用它的字段將是公開的,所以這並不算真正繼承私有狀態。 ;)公共狀態是沒有問題的,只需將狀態相關的方法拖入界面即可。 – Nicolai

27

私有方法不會被子類繼承,所以此功能不會影響實現類。我相信接口中的私有方法允許我們在默認方法之間共享代碼。

Java接口仍然不能有非靜態成員。這是一個很大的差異,而不是多重繼承IMO。

19

Java 9接口仍然不能包含字段和構造函數。這在類和接口之間產生了巨大的差異,所以Java 9遠沒有多重繼承。

2

版本9中的Java接口具有私有方法,但具有靜態私有方法。該功能已被引入以允許模塊化方法。一個功能應該與一個責任一起工作,而不是使用冗長的缺省方法。它與多個繼承無關。 更私有的靜態方法,您將能夠編寫乾淨且可重用的代碼的次數越多。無論如何,靜態方法無論是public還是protected都不能被覆蓋。