- ベストアンサー
スーパークラスのコンストラクタの呼び出し
こんにちは。 スーパークラスに引数のあるコンストラクタと引数のないコンストラクタをサブクラスで継承する際の質問です。 具体的に書くと下記になります。 class A { A () {} A (int i) {} } class B extends A { } 何がわからないかというと 『スーパークラスのA()は、サブクラスのBでわざわざ明示的にスーパークラスのコンストラクタ呼び出しをしなくても問題ないというのはわかるのですが、なぜスーパークラスのA(int)は、呼び出さなくても良いのかということです。』 もしかしたら基礎中の基礎かもしれませんが、ご教授よろしくお願いいたします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
> なぜスーパークラスのA(int)は、呼び出さなくても良いのか コンストラクタはメソッドと異なり、継承されないからです。 そのため、必要なければ呼び出す必要がないのです。
その他の回答 (3)
- aoi2008
- ベストアンサー率42% (6/14)
#2です >>これは、感覚的にはわかるのですが何故、どれか一つでよいのかが不思議です。 コンストラクタはインスタンスの初期化をするのがお仕事です。 つまりコンストラクタをオーバーロードするということは、初期化の方法をいくつも用意することと同意です。 いくつ初期化の方法があろうと、少なくともどれか1つを実行すれば初期化はできますよね? というわけで、スーパークラスのコンストラクタを1つ呼び出せばそれで十分、というわけです
お礼
度々、ご返答有難うございます。 #2と#4の内容に少し矛盾を感じてしまいました。 #2だと必要ならばコンストラクタを呼び出すといっているのに対し#4だといくつ初期化の方法があろうと、少なくともどれか1つを実行すれば初期化はできるということは、引数のないコンストラクタがスーパークラスで使用さえしていればJAVAはデフォルトで引数のないコンストラクタの呼び出しをするということでわざわざ明示的にコンストラクタの呼び出しをする必要はないという解釈になる気がします。 すいません、教えて頂いている立場なのに偉そうなことを言って... お忙しい中、本当に有難うございました。
- aoi2008
- ベストアンサー率42% (6/14)
こんにちは Javaではスーパークラスのコンストラクタのうち、どれか一つをを呼び出せば良いからです。 明示的にサブクラスでコンストラクタを実装しない場合は、デフォルトコンストラクタが、引数なしのコンストラクタを呼んでいるからOK。 (もちろんコンストラクタを実装して引数なしのコンストラクタを呼んでも良いが、 スーパークラスに引数なしのコンストラクタがなければエラーになる) 引数ありのコンストラクタ呼び出しが必要な場合は、#1さんもおっしゃっているようにコンストラクタ内で super(100); と明示的に書いてあげると、コンストラクタを呼んでいるのでOK。ということになります
お礼
ご返答有難うございました。 >Javaではスーパークラスのコンストラクタのうち、どれか一つをを呼び出せば良いからです。 これは、感覚的にはわかるのですが何故、どれか一つでよいのかが不思議です。 自分でも、もうちょっと考えてみます。
- _ranco_
- ベストアンサー率58% (126/214)
> A(int)は、呼び出さなくても良いのかということです。 その必要があるなら、 public B(){ super(100); ... ... } のように呼び出します。
お礼
ご返答有難うございました。 ご指摘いただいた点は、自分自身でも確認済みでした... もう少し、いろいろ考えてみます。
お礼
ご返答有難うございました。 なるほど!! 確かにそうですね。でも、コンストラクタも特殊ではありますがメソッドですよね... 自分でももっと考えてみます。 ありがとうございました。