この記事はJavaとPythonを基礎から学びたい私のための Advent Calendar 2024の8日目の記事です
継承は奥が深いかもしれないと感じました。
継承とは
"元のクラスの特徴を引き継いで、別のクラスを作成する"
ことのようです。
実際に確認してみます。
元となるAはロボットとして、「私はロボットです」と言ってもらうことにします。
public class Robot{
public void Aisatu(){
String A="I'm Robot";
System.out.println(A);
}
}
継承先には、ロケットパンチを打ってもらいます。
public class TuyoiRobot extends Robot{
public void Attack(){
String B="Rocket Punch";
System.out.println(B);
}
}
そして、継承先の強いロボットが継承前の部分を含んでいることを確認します
public class Main {
public static void main(String[] args){
TuyoiRobot TR=new TuyoiRobot();
TR.Aisatu();
TR.Attack();
}
}
これで実行すると、
I'm Robot
Rocket Punch
継承元のものから継承後のものを持ってくることができることが確認できました。
public static void main(String[] args)のないロボット系のプログラム単体で実行することはできません。別のプログラムから参照させることで動かすことができます。
継承を行うと、継承元を「親クラス」、継承先を「子クラス」と呼ぶそうです。
継承元と継承後に同じものが存在する場合
継承元と継承後に同じものが存在する場合には、継承後のものが優先して実行されるようです。また、継承後のほうが実行されると継承元のほうは実行されませんでした。
さっきの強いロボットのほうに
public void Aisatu(){
String A="Hello!";
System.out.println(A);
}
こんな文を追加しました。これで実行すると
Hello!
Rocket Punch
継承後のAisatu()が実行されており、元のAisatu()のほうは実行されませんでした。
できないこと
多重継承
Javaで禁止されていることとして、多重継承というものがあるそうです。これは二つ以上の親からから子を生み出す方法で、Javaでないほかの言語(C++)については多重継承が大丈夫なようです。
final付きのクラスの継承
まずfinalについて書いておきます。finalが付いたものはほかの部分から変更を加えられなくなります。不変のものが誤って変わることがないようにできます。例えばfinal int A=2;とか書いた場合は、Aの中身を参照できるけど変更はできないことになります。
さて、finalが付いたclassが継承できないのは仕様です。
Exception in thread "main" java.lang.VerifyError: Cannot inherit from final class
こんな感じでエラーが出ます
他にも何かあるかもしれませんが、とりあえずこの二つだけ書いておきます
is-a関係
モノによってis-aの原則と呼ばれていたり様々です。子クラスと親クラスの関係を表しています。
子クラス is-a 親クラス
の関係としてあらわされるようです。「子クラスは、親クラスである。」と言っています。この関係にならない継承はよくないそうです。
似た名前としてhas-a関係があるようです。AとBを使て説明すると、
クラス A has-a クラス B
となります。「AはBを持っている」関係がわかると思います。
「is-a」や「has-a」のように、望ましい関係が存在しています。
まとめ
継承を行うことで、しないときと比べて
・コピペして同じ内容を書く手間を省ける
・変更点があった際にすべてのクラスを書き換える手間を省ける
といったメリットがあった。
ただし多重継承やfinalが付いたクラスの継承などの禁止事項があった。
また、is-aの原則として望ましい関係があった。
参考文献
株式会社インプレス,スッキリわかるJava入門 第4版