継承
Javaマスターへの第一歩!プログラミングの基本を学びましょう!
変数とデータ型2024/2/23 6:112024/11/25 1:06演算子2024/2/23 6:102024/11/25 1:06制御文2024/2/23 6:092024/11/25 1:06配列2024/2/23 6:082024/11/25 1:06メソッド2024/2/23 6:062024/11/25 1:06オブジェクト指向2024/2/23 6:052024/11/25 1:06コンストラクタ2024/2/23 6:032024/11/25 1:06カプセル化2024/2/23 6:022024/11/25 1:06継承2024/2/23 6:002024/11/25 1:06ポリモーフィズム2024/2/23 5:502024/11/25 1:06パッケージとクラスライブラリ2024/2/23 5:472024/11/25 1:06抽象クラスとインターフェース2024/2/23 5:432024/11/25 1:06コレクションフレームワーク2024/2/23 5:442024/11/25 1:06関数型インターフェースとラムダ式2024/2/23 5:412024/11/25 1:06Stream API2024/2/23 5:332024/11/25 1:06例外処理2024/7/21 23:092024/11/25 1:06
このチャプターの目次
継承とは?
「クラスの特徴を別のクラスが引き継ぐこと」です。既存のクラスをもとに新しいクラスを作成することができます。
継承をすると、クラス間に親子関係が生まれます。
- 親クラス
- 継承元のクラス
- 子クラス
- 親クラスの機能を引き継いで新しく生まれたクラス
になります。
extendsというキーワードを使います。
Aというclassがあるとしましょう。
クラスAを継承したクラスBは
と書きます。
「子クラスが親クラスを拡張(extends)している」ということです。
継承でできること
- 親クラスの機能を子クラスが使うこと
- 新しい機能の追加
- フィールド
- メソッド
- 既存機能の書き換え(オーバーライド)
既存機能の利用
有線のイヤホンと
AirPodsのようなワイヤレスイヤホンを例に、
継承でできることの解説をしていきたいと思います。
イヤホンクラス、Earphonesを作ってみました。
Earphonesクラスを継承した子クラスはワイヤレスイヤホンクラスとします。英語ではEarbudsというので、Earbudsクラスとしました。
どちらも音声を聴くという機能があります。親クラスではlistenというメソッドが宣言されています。子クラス、Earbudsにlistenメソッドを宣言する必要はありません。
子クラスは親クラスの機能を使うことができるからです。
Earbudsクラスを利用するクラスは、以下のようになります。
Earbudsクラスにはlistenメソッドが記述されていませんが、インスタンスを生成してlistenメソッドを実行することができます。
新しい機能の追加
Earbudsには今までにない機能があります。イヤホンを耳から外すと「再生が停止する」という機能です。earoutという名前のメソッドを定義してみました。
この機能は親クラスEarphonesにはありません。
Earbudsクラスを使う側のクラスはこのようになります。
親クラスに存在する既存の機能と、子クラスに追加された新しい機能の両方を実行することができます。
オーバーライドとは?
オーバーライドとは、「親クラスの既存機能を継承した子クラスで書き換えること」です。オブジェクト指向の特徴の1つ、ポリモーフィズム(多態性)を実現するための非常に大切な文法です。
子クラスで親クラスにあるメソッドを再定義することです。
名前や引数の型と数、戻り値の型が全く同じメソッドを定義すると、親クラスのメソッドを子クラスのメソッドで書き換えることができます。
イヤホンは、音源を再生する機器に繋げないと音を聞くことはできません。Earphonesクラスに、connectというメソッドを実装しました。
Earbudsクラスも同様に機器に繋げないと音を聞くことはできませんが、その繋ぎ方が少し違います。connectというメソッドを実装しました。
メソッド名、引数、戻り値はすべて親クラスのメソッドと同じです。
Earbudsをつないで、再生、停止させたプログラムはこちらです。
実行するとこのような結果になります。
superキーワード
superキーワードは、親クラス(スーパークラス)のメソッドやコンストラクタ、フィールドにアクセスするために使用される特別なキーワードです。このキーワードを使用することで、子クラスから親クラスのメンバーを明示的に呼び出すことができます。主な用途としては、子クラスのコンストラクタから親クラスのコンストラクタを呼び出す場合などがあります。
super()
子クラスのコンストラクタから親クラスのコンストラクタの呼び出しには、を使用します。これにより、親クラスの初期化処理を確実に行うことができます。
Childクラスのコンストラクタが呼び出されると、まずによって親クラスParentのコンストラクタが実行されていることが分かります。その後に子クラスのコンストラクタの内容が実行されます。
また、親クラスのコンストラクタがオーバーライドされていて引数を取る場合も同様に、引数を指定して呼び出すことができます。
Childクラスのコンストラクタでは、
で、Parentクラスのnameフィールドとageフィールドを初期化しています。これにより、Childクラスで冗長な処理を実装する必要がなくなり、継承の特徴の1つである「生産性の向上」が実現されています。