プロが教える店舗&オフィスのセキュリティ対策術

こんにちは。

スーパークラスに引数のあるコンストラクタと引数のないコンストラクタをサブクラスで継承する際の質問です。
具体的に書くと下記になります。

class A {
A () {}
A (int i) {}
}
class B extends A {
}

何がわからないかというと
『スーパークラスのA()は、サブクラスのBでわざわざ明示的にスーパークラスのコンストラクタ呼び出しをしなくても問題ないというのはわかるのですが、なぜスーパークラスのA(int)は、呼び出さなくても良いのかということです。』

もしかしたら基礎中の基礎かもしれませんが、ご教授よろしくお願いいたします。

A 回答 (4件)

> なぜスーパークラスのA(int)は、呼び出さなくても良いのか



コンストラクタはメソッドと異なり、継承されないからです。
そのため、必要なければ呼び出す必要がないのです。
    • good
    • 0
この回答へのお礼

ご返答有難うございました。

なるほど!!
確かにそうですね。でも、コンストラクタも特殊ではありますがメソッドですよね...
自分でももっと考えてみます。
ありがとうございました。

お礼日時:2008/06/27 21:47

#2です



>>これは、感覚的にはわかるのですが何故、どれか一つでよいのかが不思議です。

コンストラクタはインスタンスの初期化をするのがお仕事です。
つまりコンストラクタをオーバーロードするということは、初期化の方法をいくつも用意することと同意です。

いくつ初期化の方法があろうと、少なくともどれか1つを実行すれば初期化はできますよね?
というわけで、スーパークラスのコンストラクタを1つ呼び出せばそれで十分、というわけです
    • good
    • 0
この回答へのお礼

度々、ご返答有難うございます。
#2と#4の内容に少し矛盾を感じてしまいました。
#2だと必要ならばコンストラクタを呼び出すといっているのに対し#4だといくつ初期化の方法があろうと、少なくともどれか1つを実行すれば初期化はできるということは、引数のないコンストラクタがスーパークラスで使用さえしていればJAVAはデフォルトで引数のないコンストラクタの呼び出しをするということでわざわざ明示的にコンストラクタの呼び出しをする必要はないという解釈になる気がします。
すいません、教えて頂いている立場なのに偉そうなことを言って...
お忙しい中、本当に有難うございました。

お礼日時:2008/06/27 21:41

こんにちは



Javaではスーパークラスのコンストラクタのうち、どれか一つをを呼び出せば良いからです。

明示的にサブクラスでコンストラクタを実装しない場合は、デフォルトコンストラクタが、引数なしのコンストラクタを呼んでいるからOK。
(もちろんコンストラクタを実装して引数なしのコンストラクタを呼んでも良いが、
スーパークラスに引数なしのコンストラクタがなければエラーになる)

引数ありのコンストラクタ呼び出しが必要な場合は、#1さんもおっしゃっているようにコンストラクタ内で
super(100);

と明示的に書いてあげると、コンストラクタを呼んでいるのでOK。ということになります
    • good
    • 0
この回答へのお礼

ご返答有難うございました。

>Javaではスーパークラスのコンストラクタのうち、どれか一つをを呼び出せば良いからです。

これは、感覚的にはわかるのですが何故、どれか一つでよいのかが不思議です。
自分でも、もうちょっと考えてみます。

お礼日時:2008/06/26 18:43

> A(int)は、呼び出さなくても良いのかということです。


その必要があるなら、

public B(){
 super(100);
 ...
 ...
}

のように呼び出します。
    • good
    • 0
この回答へのお礼

ご返答有難うございました。
ご指摘いただいた点は、自分自身でも確認済みでした...
もう少し、いろいろ考えてみます。

お礼日時:2008/06/26 18:27

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!