この回答の最後にあるメモに基づくと、Java ではサブタイプと継承が微妙に異なる概念であるように見えます。それは何ですか?クラス宣言にextends ...
句が含まれている場合にのみ継承されますか? この場合、クラスは Object のサブタイプであっても Object から継承されませんよね?
5 に答える
継承は、サブタイプを実現する方法です。ウィキペディアから引用:
プログラミング言語理論では、サブタイプ (サブタイプ ポリモーフィズムまたは包含ポリモーフィズム) は型ポリモーフィズムの形式であり、サブタイプは、代入可能性の概念によって別のデータ型 (スーパータイプ) に関連付けられたデータ型です。つまり、プログラム要素、通常はサブルーチンスーパータイプの要素を操作するように記述された関数または関数は、サブタイプの要素を操作することもできます。
要するに、これを見てみましょう:
class Super {
}
class Child extends Super {
}
Child
からすべてを継承するため、これは継承Super
です。
Super super = new Child();
として参照しているため、これはサブタイプです。したがって、継承によってサブタイピングを実行できると私が言ったときの意味がわかると思いますが、それらは同じものではありません。Child
Super
たとえば、インターフェイスを使用してサブタイピングを実現できます。
class Child extends Super implements ISomeInterface {
}
これで、次のように参照できますChild
。
ISomeInterface someInterface = new Child();
ここではISomeInterface
、継承関係を必要とせずに type と呼んでいます。
あなたの質問
Java のすべてObjects
は type のサブクラスですObject
。クラスヘッダーに暗黙的に含まれています。extends Object
それはまさに言語が機能する方法です。そうです、すべてのオブジェクトは class のサブタイプですObject
。
Java では、継承はextends
キーワードを使用することによってのみ利用できます。
余分な読書
Liskov Substitution Principleは、サブタイプのアイデアに重点を置いた設計原則です。
Java クラス間のさまざまな関係。これにより、OOP をより深く理解することができます。
編集
マルコ・トポリニクの言うことをすべて聞いてください。彼はかなり賢いです。
脚注には次のように書かれています。
たまたま、 「サブタイプ」の概念は「継承元」と完全に一致しているわけではありません。スーパーインターフェースを持たないインターフェースは、実際には
Object
( § 4.10.2. クラスとインターフェースタイプ間のサブタイプ) から継承していなくても、サブタイプですObject
。
インターフェイスは他のインターフェイスを拡張することしかできません。明示的または暗黙的extends Object
に、実際にはそれらのどれも拡張できません。それでも、すべてのメソッドはすべてのインターフェースで利用できます。これにより、インターフェイス自体がクラスからこれらのメソッドの実装を継承していなくても、サブタイプのようなインターフェイスが作成されます。Object
List<>
Object
Object
Object
継承とサブタイプは、2 つの別個の概念です。型はその親型からのみ継承できます。したがって、継承はサブタイプの関係に結び付けられます。ただし、その逆は成立しません。サブタイプは必ずしも親から何かを継承するとは限りません。言語規則は、サブタイプによって継承されるものを正確に指示します。
Java の例では、プライベート メンバーは継承されません。Java 8 では、インターフェースは静的メソッドを宣言できますが、そのサブタイプはそれらのメンバーを継承しません。
サブタイプとは、インターフェースの互換性を指します。タイプ A のオブジェクトで呼び出すことができるすべての関数を、タイプ B のオブジェクトでも呼び出すことができる場合、タイプ B は A のサブタイプです。
継承とは、実装の再利用を指します。B の関数が A の関数の観点から記述されている場合、型 B は別の型 A を継承します。
通常、サブクラスはそのスーパークラスのすべてのメソッドを使用できますが、継承ではこれは必要ありません
出典:こちら
継承は明示的で、サブタイプは暗黙的です。
すべて (プリミティブ型を除く) はオブジェクトのサブタイプです。extends
キーワード を明示的に使用する場合は、継承を使用しています。