🐈

Java言語におけるクラス継承について(個人的まとめ)

2022/06/27に公開

継承してクラスを作る

継承= 既存のクラスを土台にして新しく土台を作る仕組み

車からスポーツカー、タクシー、軽トラといった異なる特徴の車を設計したいとき、継承を使う。 オブジェクト指向の観点から「SportsCar」「Taxi」といった似通ったクラスは「Car」クラスから継承して、共通する部分はそのままにし、各車の特徴だけを変更したり追加したりする。


「めんどいし、じゃあ別々の独立したクラスをしてクラスいっぱい書けばええやん」と思うかもしれないが、オブジェクト指向の観点からは「SportsCar」「Taxi」などを別々のクラスにするのは良くないとされている。
例えば車に共通する機能の変更があったとする(例:2040年に全ての自動車が電気自動車でなければならず、ガソリン車は製造禁止になった、など)

その場合「SportsCar」「Track」「Taxi」のすべてのエンジンに関わる変数を修正しなければいけない。

これがバグなどの温床になる。から

継承の書き方

java
class サブクラス名 extends 親クラス名{}

「サブクラスを作ります。親クラスとして 親クラス名 を継承しています」ってこと。車を例に出すと

java
class SportsCar extends Car{}

って感じだな
また、
親クラスを「スーパークラス」と言い、
子クラスを「サブクラス」と言う

インスタンスの初期化の注意点

  1. ポイントは継承した部分とそれ以外の部分を分けて初期化しないと行けない点
  2. Car(id,name)とは書けない。コンストラクタの中では一行目にsuperを使う書き方しか許されていない
  • 文法ではサブクラスは取り込んだ親クラスの部分を最初に初期化しないと行けないルールになっている。だからコンストラクタの一行目は必ず
    super(id,name)のように親クラスのコンストラクでないといけない

要するに

コンストラクタの一行目は必ずsuper()を書く

また、親クラスのコンストラクタに引数がある場合はそれも指定する。よって子クラスのコンストラクタには引数として親クラスの初期化に必要なものも含めないといけない。

さらに、親クラスのメソッドを子クラスの中で使うのは何の問題もない。(車共通の機能をSportsCar内で使うのは何の問題もないでしょう。ってこと)

親クラスのprivateなメンバは「継承している」というのか?

結論から言うと、親クラスのprivateなメンバ(変数とか)は継承しているとは言わない
なぜなら、子クラスの中に親クラスのprivateなメンバは「存在」しているが、「鍵がかかっている」状態。
親クラスのprivateなメンバはサブクラスからはアクセスできないのである

継承では「アクセスできるメンバだけ」を「継承したメンバ」と言うので、存在してもアクセスできない「privateな親クラスのメンバ」
は「継承していないメンバ」と見なされることになる。

以上です。参考文献は「新わかりやすいJava オブジェクト指向徹底解説」です

GitHubで編集を提案

Discussion