Java-inheritance
Java-継承
継承は、あるクラスが別のクラスのプロパティ(メソッドとフィールド)を取得するプロセスとして定義できます。 継承を使用すると、情報は階層的な順序で管理可能になります。
他のプロパティを継承するクラスはサブクラス(派生クラス、子クラス)と呼ばれ、プロパティが継承されるクラスはスーパークラス(ベースクラス、親クラス)と呼ばれます。
キーワードを拡張
構文
サンプルコード
以下は、Javaの継承を示す例です。 この例では、CalculationとMy_Calculationという2つのクラスを観察できます。
extendsキーワードを使用して、My_Calculationは、Calculationクラスのメソッドadd()およびSubtraction()を継承します。
次のプログラムをコピーして、My_Calculation.javaという名前のファイルに貼り付けます
- 例 *
以下に示すように、上記のコードをコンパイルして実行します。
プログラムを実行した後、それは次の結果を生成します-
出力
指定されたプログラムでは、 My_Calculation クラスのオブジェクトが作成されると、スーパークラスのコンテンツのコピーがその中に作成されます。 そのため、サブクラスのオブジェクトを使用して、スーパークラスのメンバーにアクセスできます。
スーパークラス参照変数はサブクラスオブジェクトを保持できますが、その変数を使用するとスーパークラスのメンバーのみにアクセスできるため、両方のクラスのメンバーにアクセスするには、常にサブクラスへの参照変数を作成することをお勧めします。
上記のプログラムを検討する場合、以下に示すようにクラスをインスタンス化できます。 ただし、スーパークラス参照変数(この場合は cal )を使用すると、サブクラスMy_Calculationに属するメソッド* multiplication()*を呼び出すことはできません。
注-サブクラスは、スーパークラスからすべてのメンバー(フィールド、メソッド、ネストされたクラス)を継承します。 コンストラクタはメンバではないので、それらはサブクラスによって継承されませんが、スーパークラスのコンストラクタはサブクラスから呼び出すことができます。
スーパーキーワード
- 同じ名前を持つ場合、サブクラスのメンバーからスーパークラスのメンバーを区別するために使用されます。
- サブクラスからスーパークラスコンストラクターを呼び出すために使用されます。
メンバーの差別化
クラスが別のクラスのプロパティを継承している場合。 また、スーパークラスのメンバーの名前がサブクラスと同じ場合、これらの変数を区別するために、以下に示すようにスーパーキーワードを使用します。
サンプルコード
このセクションでは、 super キーワードの使用法を示すプログラムを提供します。
指定されたプログラムには、_Sub_class_と_Super_class_という2つのクラスがあり、両方とも異なる実装のdisplay()という名前のメソッドと、異なる値のnumという変数を持っています。 両方のクラスのdisplay()メソッドを呼び出し、両方のクラスの変数numの値を出力しています。 ここで、スーパークラスのメンバーとサブクラスを区別するためにスーパーキーワードを使用したことがわかります。
Sub_class.javaという名前のファイルにプログラムをコピーして貼り付けます。
例
次の構文を使用して、上記のコードをコンパイルおよび実行します。
プログラムを実行すると、次の結果が得られます-
出力
スーパークラスコンストラクターの呼び出し
クラスが別のクラスのプロパティを継承している場合、サブクラスはスーパークラスのデフォルトコンストラクターを自動的に取得します。 ただし、スーパークラスのパラメーター化されたコンストラクターを呼び出す場合は、以下に示すようにsuperキーワードを使用する必要があります。
サンプルコード
このセクションで提供されるプログラムは、superキーワードを使用して、スーパークラスのパラメーター化されたコンストラクターを呼び出す方法を示しています。 このプログラムにはスーパークラスとサブクラスが含まれ、スーパークラスには整数値を受け入れるパラメーター化されたコンストラクターが含まれ、スーパーキーワードを使用してスーパークラスのパラメーター化されたコンストラクターを呼び出しました。
Subclass.javaという名前のファイルに次のプログラムをコピーして貼り付けます
例
次の構文を使用して、上記のコードをコンパイルおよび実行します。
プログラムを実行すると、次の結果が得られます-
- 出力 *
IS-A関係
IS-Aは、このオブジェクトの種類の1つです。* extends *キーワードを使用して継承を実現する方法を見てみましょう。
さて、上記の例に基づいて、オブジェクト指向の用語では、次のとおりです-
- 動物は哺乳類クラスのスーパークラスです。
- 動物は爬虫類クラスのスーパークラスです。
- 哺乳類と爬虫類は動物クラスのサブクラスです。
- 犬は、哺乳類と動物の両方のクラスのサブクラスです。
今、IS-A関係を考慮する場合、次のように言えます-
- 哺乳類IS-A動物
- 爬虫類IS-A動物
- 犬IS-A哺乳類
- したがって:犬IS-A動物も
extendsキーワードを使用すると、サブクラスは、スーパークラスのプライベートプロパティを除く、スーパークラスのすべてのプロパティを継承できます。
インスタンス演算子を使用することで、哺乳類が実際に動物であることを保証できます。
例
これは、次の結果を生成します-
出力
一般に、 implements キーワードはクラスで使用され、インターフェイスのプロパティを継承します。 インターフェイスをクラスで拡張することはできません。
例
instanceofキーワード
例
これは、次の結果を生成します-
出力
HAS-A関係
これらの関係は、主に使用法に基づいています。 これは、特定のクラスが HAS-A 特定のものであるかどうかを判別します。 この関係は、コードの重複とバグの削減に役立ちます。
例を見てみましょう-
例
これは、クラスVan HAS-A Speedを示しています。 Speedに個別のクラスを用意することで、speedに属するコード全体をVanクラスに入れる必要がなくなり、複数のアプリケーションでSpeedクラスを再利用できるようになります。
オブジェクト指向機能では、ユーザーはどのオブジェクトが実際の作業を行っているかを気にする必要はありません。 これを実現するために、Vanクラスは実装の詳細をVanクラスのユーザーから隠します。 したがって、基本的にユーザーはVanクラスに特定のアクションを実行するように要求し、Vanクラスは自分で作業を実行するか、別のクラスにアクションを実行するように要求します。
継承の種類
以下に示すように、継承にはさまざまなタイプがあります。
覚えておくべき非常に重要な事実は、Javaは多重継承をサポートしていないということです。 これは、クラスが複数のクラスを拡張できないことを意味します。 したがって、以下は違法です-
例
ただし、クラスは1つまたは複数のインターフェイスを実装できます。これにより、Javaは多重継承の不可能性を取り除くことができました。