2017-06-01 13 views
29

Java 9では、privateprivate staticメソッドをインターフェイスでも定義できるようになるため、残りの違いはinterfaceclassになりますか? さらに、Javaは複数の継承に向かってゆっくりと移行していますか?Java 9インターフェイスvsクラス

+26

私はこれに非常に多くのupvotesがあることに驚いています...残っている違い: 'protected'サポート、' package-private'サポート**基本的に 'private'と' static' **の追加を除いて全て**インターフェースはクラスを拡張することはできません、予約されたキーワード 'interface'と' class '、* 2つの存在のための哲学/目的/理由。おそらく続けるかもしれない.. –

+4

@VinceEmighあなたの懸念を理解しています。しかし、誰かが私のキャリアの始まりで私に言った: "愚かな質問はありません"。そして、あなたを含めて、すべての人がこれを理解するだろうと私は知っています。 – Aakash

+3

答えはまだ、[privateメソッド]が​​あることを除けば、[Java 8での抽象クラスとのインタフェース](https://stackoverflow.com/q/19998454/2711488)と同じですが、明らかに他のクラスに影響を与えることはできません。 – Holger

答えて

35

Java 9のプライベートインタフェースメソッドは、他のプライベートメソッドとまったく同じように動作します。これらは、(抽象クラ​​スでも)ボディを持たなければならず、サブクラスでも呼びもオーバーライドもできません。そのようなものとして、彼らは本当に継承と相互作用しません。その話(特に多重継承)、(少なくとも?)が存在することの三種類:一種で例えば、別のタイプであってもよいことを意味タイプの

  • 継承StringObjectです。 Javaは1日目から複数のタイプの継承を(インターフェース経由で)可能にしました。
  • 動作の継承は、あるタイプが別のタイプの動作を継承できることを意味します。 Java 8より前では、クラスだけがメソッドを実装できるため、この種の継承は1つしかありませんでした。 Java 8では、インターフェースがメソッドを実装できるようにするデフォルトメソッドが用意されており、Javaに動作の多重継承が与えられています。
  • 状態の継承は、ある型が別の型の内部状態(つまりフィールド)を継承することを意味します。 Java 9と将来のJavaバージョンで現在提案されているすべてのものは、クラスだけが状態を持つことができるため、この種の継承は1つしかありません。

私が見ることができるように、プライベートインターフェイスメソッドはここに何も追加しません。

インターフェイスとクラスの比較方法に関する2つの主な違いがあります。多重継承と状態です。インタフェースは前者をサポートし、後者は後者を持つことができます。典型的なOOPでは状態は重要であるため、クラスは関連性を維持します。

インターフェイスが特定の非公開フィールドを持つように強制する方法や、自分自身を定義する方法があれば、ゲームは変わり、インターフェイスはクラスと競合する可能性があります。

+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インターフェイスにはプライベートメソッドがありますが、静的プライベートです。この機能は、モジュラーメソッドを可能にするために導入されました。 1つの関数は、長いデフォルトメソッドを使用するのではなく、1つの責任で機能するはずです。それは複数の継承とは関係ありません。 プライベート静的メソッドが多くなるほど、クリーンで再利用可能なコードを書くことができます。とにかく、publicかprotectedかのどちらかの静的メソッドはオーバーライドできません。

関連する問題