プログラミング Java

【Java入門】クラスの継承、オーバーライド

投稿日:2021年5月28日 更新日:

概要

クラスの継承とは、継承元(親)のフィールド(値)、メソッド(機能)を継承先(子)に引き継がせることです。
継承先(子)では、追加のフィールド(値)、メソッド(機能)を持つことができます。

つまり、以下のようになります。
・継承元(親):継承先(子)に共通のフィールド、メソッドを持たせる
・継承先(子):継承元(親)に加えて、独自のフィールド、メソッドを持たせることができる
  

オーバライド

オーバライドには以下の条件を満たす必要があります。
・シグネチャが同じであること
・戻り値が同じ型である、またはサブクラスであること
・アクセス修飾子は同じである、またはより緩いこと

シグネチャが同じであること

シグネチャとは、メソッド名、引数の型、引数の数で構成されるひとまとまりのことです。
以下でコードで事例を交えて説明しておりますので、言葉だけではよくわからないという方は参照下さい。
【Java入門】メソッドとは?使い方まとめ #シグネチャとは?

戻り値が同じ型である、またはサブクラスであること

戻り値の型にはサブクラスも指定できます。
親クラスで定義されているメソッドの戻り値の型がListだったら、子クラスでオーバライドした際にはArrayListも指定できるということになります。
(List、ArrayListは比較的メジャーなスーパークラス – サブクラスの関係なので、ピンときやすいかなと思って例に挙げました)

アクセス修飾子は同じである、またはより緩いこと

アクセス修飾子の強弱関係は以下のようになります。(左が最も緩い)
public > protected > パッケージプライべート > private
同じかより緩くすることしかできないので、親クラスでの定義がpublicであれば他は指定できません。
逆にprivateであれば、いずれでも指定可能です。
 

型変換

アップキャスト

子クラスの型を親クラスの型に変換します。
子クラスには親クラスをextendsしているということがコードに書かれているので、コンパイラは互換性があると判断できます。
なのでアップキャストの場合は、(型名)といったキャスト式が無くても変換は自動で行われます。

ダウンキャスト

親クラスの型を子クラスの型に変換します。
親クラスに子クラスのインスタンスを入れたとしても、コンパイラはインスタンスを見て判断するのではなく、型を見て判断するため、親クラスからは子クラスに対する互換性があるかが判断できません。
その場合、キャスト式(型名)を付けて明示的に変換します。

図解

java.lang.Numberの親子関係での例示です。
Number型を抽象クラスとして、各具象クラスが継承関係にあります。

Javaでは継承可能な親は1つだけと決まっているので、親の方に戻す時に型指定は必要ないと認識した方がわかりやすいでしょう。
そして、子クラスはいくつでも継承させられるので何に変換されたかかわかるように、親⇒子へのキャストは明示的である必要があります。

コード例

親クラス

子クラス

実行クラス

実行結果

まとめ

  • 継承によって親クラスを引き継いだ子クラスを定義できる。
  • オーバライドによって親クラスのメソッドを上書きできる。
  • 親クラスへのキャストは自動的に行われるが、子クラスへのキャストは明示的に指定する必要がある。

 
最後までお読み頂き、ありがとうございました!
ご意見・ご要望がありましたら、遠慮なくコメント下さい!
もし内容が良かったらランキング評価を頂けると励みになります(^^)

ランキング評価する

-プログラミング, Java
-, , ,

執筆者:


comment

メールアドレスが公開されることはありません。

CAPTCHA


関連記事

Facadeパターンの使い道をコードとクラス図で説明します。

Facadeパターンはどんな役に立つか? 簡単にいうと、複数の処理のまとめ役。 なので、依頼1つでいろんな仕事をやってくれる点で役に立つ。 Facadeパターンの要件 Facadeクラスはあくまでサブ …

【SpringBoot入門】#11~ 削除ダイアログの作成

概要 検索結果から削除機能を呼び出した際に、削除を確認するためのダイアログです。 実装はjQueryで行いますので、mavenへの追加作業等の準備を別途行います。 イメージ jQueryの準備 jQu …

【Java】ポートフォリオ例(高配当株分析ツール)

概要 ポートフォリオにスクレイピングツールが良いと以前の記事でご紹介しました。 どんなものが作れるのか? ということの具体例として、私が作成したスクレイピングツールを紹介します。 仕様 スクレイピング …

junit, テスト, junit5

【Junit5】アノテーションの意味をざっくりと解説

Junit5のアノテーションについてざっくりと理解するための記事です。 なんか見たことあるけど、要するに何に使うやつなんだっけ? を軽く思い出すためにあります。 テストを実行 @Test テストメソッ …

Redmineでリンクにできない場合にチェックすること

リンクにできない場合のチェック項目 前後に文字列がくっついている。 前後に全角スペースがある。 リンクの#が全角になっている。   リンクにするには? 以下のルールで記述すればリンクにできま …

SpringFramworkの良書

■おすすめ教材
Javaの基本を学んだ人が、次のステップとして読む本(中級者向け)

※SpringはJavaのFrameworkの1つです。
変更のしやすさ、保守性の高さが特徴です。