コンストラクタsuper();について vol.47
前回に引き続き継承のコンストラクタについて説明していこう。
コンストラクタは引数が被らなければ複数作ることができる。
今回は親クラスでコンストラクタが二つ以上できた時に使えるsuper();について紹介していこう。
1.複数のコンストラクタを持つ親クラス
今回は引数ありのコンストラクタと引数なしのコンストラクタを持つ親クラスで紹介していこう。
こちらが親クラス
続いて子クラス
子クラスも同じような構成でコンストラクタを作成した。
では、Mainクラスで引数を渡した場合どのような実行がされるのか。
子クラスも親クラスも引数ありのコンストラクタが実行されるのではないかと思う。
では実行してみよう。
親クラスは引数無しのコンストラクタが実行された。親クラスの引数ありのコンストラクタは実行できないのか?
結論は、引数ありでもできる。
では、どうやるのか。
super();を使う。
2.super();を使う
どこに書くのか。
子クラスのコンストラクタ内に書くだけ。
このように子クラスの実行処理の前にsuper();を書いてあげるだけ、そして今回は引数がintのコンストラクタを呼び出したいので、super();に引数を入れた。
その結果を見てみよう。
これで、コンストラクタの呼び出しに成功した。
ちなみにsuper();を子クラスの実行処理の後に書くとこのようにエラーになる。
ではなぜ、super();を書かなかったとき引数なしのコンストラクタが実行されたのか。
それはデフォルトで引数無しのコンストラクタが設定されているから。
3.デフォルトのsuper();
今回は引数無しのコンストラクタがあったが、ない場合はどうなるのか。
親クラスの引き数なしのコンストラクタをコメントアウトしてみた。
子クラスにどんな影響を与えるのか。
子クラスのコンストラクタにエラーが起きた。
今まではデフォルトで引数無しのコンストラクタを呼び出せていたが、なくなると任意でsuper(引数);を書いて呼び出さなくてはいけない。
super(引数);を書けば解決できてしまうが。
4.複数のコンストラクタの注意点
コンストラクタの注意点として、同じ引数のコンストラクタは使えない。
例えばこのように引数の変数名が変わっていてもデータ型が一致していたらエラーになる。解決方法はデータ型を変えるか、引数を増やす。
このように引数を増やしてあげるだけでエラーを回避でいる。
エラーになる理由としては、
・コンストラクタは一回のnewで一つしか呼び出せない
・引数が同じだとどちらを呼び出しているのか判断ができなくなる
この点があげられる。
今回は以上
では、また次回
元体育会系文系エンジニア石黒
この記事が気に入ったらサポートをしてみませんか?