• ベストアンサー

スーパークラスのコンストラクタの呼び出し

こんにちは。 スーパークラスに引数のあるコンストラクタと引数のないコンストラクタをサブクラスで継承する際の質問です。 具体的に書くと下記になります。 class A { A () {} A (int i) {} } class B extends A { } 何がわからないかというと 『スーパークラスのA()は、サブクラスのBでわざわざ明示的にスーパークラスのコンストラクタ呼び出しをしなくても問題ないというのはわかるのですが、なぜスーパークラスのA(int)は、呼び出さなくても良いのかということです。』 もしかしたら基礎中の基礎かもしれませんが、ご教授よろしくお願いいたします。

  • Java
  • 回答数4
  • ありがとう数5

質問者が選んだベストアンサー

  • ベストアンサー
  • nknk80
  • ベストアンサー率65% (17/26)
回答No.3

> なぜスーパークラスのA(int)は、呼び出さなくても良いのか コンストラクタはメソッドと異なり、継承されないからです。 そのため、必要なければ呼び出す必要がないのです。

code55
質問者

お礼

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

その他の回答 (3)

  • aoi2008
  • ベストアンサー率42% (6/14)
回答No.4

#2です >>これは、感覚的にはわかるのですが何故、どれか一つでよいのかが不思議です。 コンストラクタはインスタンスの初期化をするのがお仕事です。 つまりコンストラクタをオーバーロードするということは、初期化の方法をいくつも用意することと同意です。 いくつ初期化の方法があろうと、少なくともどれか1つを実行すれば初期化はできますよね? というわけで、スーパークラスのコンストラクタを1つ呼び出せばそれで十分、というわけです

code55
質問者

お礼

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

  • aoi2008
  • ベストアンサー率42% (6/14)
回答No.2

こんにちは Javaではスーパークラスのコンストラクタのうち、どれか一つをを呼び出せば良いからです。 明示的にサブクラスでコンストラクタを実装しない場合は、デフォルトコンストラクタが、引数なしのコンストラクタを呼んでいるからOK。 (もちろんコンストラクタを実装して引数なしのコンストラクタを呼んでも良いが、 スーパークラスに引数なしのコンストラクタがなければエラーになる) 引数ありのコンストラクタ呼び出しが必要な場合は、#1さんもおっしゃっているようにコンストラクタ内で super(100); と明示的に書いてあげると、コンストラクタを呼んでいるのでOK。ということになります

code55
質問者

お礼

ご返答有難うございました。 >Javaではスーパークラスのコンストラクタのうち、どれか一つをを呼び出せば良いからです。 これは、感覚的にはわかるのですが何故、どれか一つでよいのかが不思議です。 自分でも、もうちょっと考えてみます。

  • _ranco_
  • ベストアンサー率58% (126/214)
回答No.1

> A(int)は、呼び出さなくても良いのかということです。 その必要があるなら、 public B(){  super(100);  ...  ... } のように呼び出します。

code55
質問者

お礼

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

関連するQ&A

  • 継承における暗黙のデフォルトコンストラクター

    ”継承の際、スーパークラスで引数なしのコンストラクターが省略せずにきちんと記述されるなら、そのサブクラスでコンストラクターを記述しなくても、スーパークラスの引数なしのコンストラクターが受け継がれるためコンパイルエラーがおきない。”のは分かりますが”スーパークラスで引数なしのコンストラクターが省略され、かつサブクラスでコンストラクターを省略した場合”はなぜコンパイルエラーがおきるのでしょうか? 暗黙の内にスーパークラスにコンストラクターが生成され、それがサブクラスに受け継がれることは出来ないのでしょうか? 宜しく願います。

  • 継承(extends)について

    extendsについてわからないことがあります。 次の3つのクラスがあった時、 class スーパークラス { ... class サブクラス1 extends スーパークラス { ... class サブクラス2 extends サブクラス1 {... サブクラス2は、サブクラス1でスーパークラスから継承しているフィールドをメソッドを継承するのでしょうか?

    • ベストアンサー
    • Java
  • スーパークラスのコンストラクタの処理を引き継ぐ

    基本情報18年秋のJava問題問12の設問1(a)の問でわからないことがあるので教えてください。 スーパークラスを継承したクラスのコンストラクタ内の処理を、スーパークラスのコンストラクタと同じ処理する場合の記述についてです。 問題と解答(http://www.jitec.jp/1_04hanni_sukiru/mondai_kaitou.html#18aki)はここですが、簡単に書くと、次のようになります。 抽象クラスBook abstract class Book { String name; String id; Book(String name, String id) { this.name = name; this.id = id; } ~ } Bookを継承したRegularBook class RegularBook extends Book { RegularBook(String name, String id) { ここが穴埋め ; } ~ } 穴埋めの解答群5つのうちの2つが次のとおりです。 エ super(name, id) オ this.name = name; this.id = id もちろんエが正解です。 普通ここにエの記述をするのはわかるのですが、なぜ「オ」が「絶対に間違い」と言い切れるのかが分からないのです。 スーパークラスのコンストラクタ内の処理が変更になった場合、それを継承するクラスのコンストラクタの処理にも反映されるとか、そういう意味でもエの書き方は便利だとは思いますが、オも絶対に間違いといいきれないのでは?? お尋ねしたいのは、情報処理試験の問題として、絶対に間違いでない選択肢を2つ以上もいれるはずもないので、オは「なにがなんでも間違い」なんだろうけれどもその理由が分からないのです。 オが確実に間違っているという理由が分かりましたら教えてください。よろしくおねがいいたします。

  • 継承、実装についてまとめています。この図は正しいですか?

    継承、実装についてまとめています。この図は正しいですか? クラス1 から継承した クラス2のものを、クラス3で継承するのでしょうか? クラス1 │ int a; │ static int b; │ │ クラス1() { } │ │ int methodA () { } │ static int methodB() { } ↓ サブクラス1 extends クラス1 │ int a; // 継承 │ int c; │ static int d; │ │ サブクラス1() { } // コンストラクタは継承しない、super()で呼び出す │ │ int methodA () { } // 継承 │ int methodC() { } │ static int methodD() { } ↓ サブクラス2 extends サブクラス1 implements サブインタフェース1, サブインタフェース2… ↑ int a; // サブクラス1のフィールドを継承 │ int c; // 継承 │ int e; │ static int f; │ public static final int g; // 実装(サブインタフェース1) │ public static final int h; // 実装 │ │ サブクラス2() { } │ │ int methodA () { } // サブクラス1のメソッドを継承 │ int methodC() { } // 継承 │ int methodE() { } │ static int methodF() { } │ int methodG() { } // 実装(サブインタフェース1) │ int methodH() { } // 実装 │ interface サブインタフェース1 extends スーパインタフェース1... ↑ public static final int h; │ │ public abstract int methodE() { } // 継承 │ public abstract int methodH() { } │ interface スーパーインタフェース public static final int g; public abstract int methodG() { }

    • ベストアンサー
    • Java
  • コンストラクタ

    恐れ入ります。 たとえばSample classを定義するとして class Sample{ int a=0; int b=0; Sample(){ //まあ、この場合は通常省略ですが。 } } とコンストラクタの前に処理を書く場合と、 class Sample{    Sample(){ int a=0; int b=0; } とコンストラクタに書く場合とでは何か違いがあるのでしょうか?本を見ると「コンストラクタはインスタンスが生成されたときに呼び出される処理」とありますが、上のような記述でも「生成されたときに処理」されますよね・・・? インスタンスを生成するときに引数を使う場合には違いはわかるのですが・・・? 引数がない場合には「コンストラクタには意味はない」であっていますか?

    • ベストアンサー
    • Java
  • クラスの継承、メソッドのオーバーライド

    ↓の問題が全然わかりません。 問題:サブクラスのsiki2にax2+bx+c=0(b2-4ac>0)とコンストラクタ を定義して、スーパークラスのsiki1にax+b=0とコンストラクタを定義し、解を求めるkaiメソッドを定義する という問題です。途中のプログラムを↓に書きました。 スーパークラス class houteisiki1{ private int kai; private int a; private int b; private int x; //コンストラクタ houteisiki1(int s, int d, int e, int f){ solve=s; a=d; b=e; x=f; } //kaiメソッド kai=(a*x)+b; } サブクラス class houteisiki2 extends houteisiki1{ static int kai(int a, int b, int c, int x){ kai=(a*x*x)+(b*x)+c; if((b*b)+(-4*a*c)>0){ return kai; }else{ println("エラー"); } } } テストクラス class test{ public static void main(string[] args){ ここまで作りましたが、解らなくなりましたので教えてください。 まだ、JAVAを勉強して日が浅いので解りやすく教えてください。

    • ベストアンサー
    • Java
  • Javaのコンストラクタについて教えてください

    Javaを勉強している初心者です。 次のようなプログラムがあります。 このプログラムでclass aおよびclass bのデフォルトコンストラクタ a() {}とb() {}をコーディングしていないとコンパイルエラーになります。 b() {}についてはclass bのパラメータのあるコンストラクタb(String s)がサブクラスclass cから明示的に呼ばれていないのでデフォルトコンストラクタb() {}をコーディングしないとエラーになる…と考えればよいのでしょうか。 それでは、a() {}はなぜ必要なのでしょうか。 どなたか教えてください。 class a { a() {} a(String s) { System.out.println("In a's constructor..."); System.out.println(s); } } class b extends a { b() {} b(String s) { super(s); System.out.println("In b's constructor..."); System.out.println(s); } } class c extends b { c(String s) { System.out.println("In c's constructor..."); System.out.println(s); } public void some() { System.out.println("something..."); } } public class appJ01 { public static void main(String args[]) { c obj = new c("Hello from Java!"); } } 

  • コンストラクタがコンパイラに理解されない

    簡単にいうと class A extends AA{ public A(Event_a a,MySession s){   super(); try{略}cacth{略} } public A(Event_b b,MySession s){  super(); try{略}cacth{略} }  //メソッド略 } という二つのコンストラクタを持ったクラスです。 コンパイル時に、「シンボル:コンストラクタ A(Event_b b,MySession s)を理解でいません」といわれてしまいます。どちらのコンストラクタも同じように使用しています。なのに、Event_aは何も言われずに、Event_bだけが理解できないと言われてしまうのは何故でしょう?訳が分かりません。何度もソースを見直しました。呼び出し元のクラスの引数も間違っていません。クラスAにはちゃんと二つのコンストラクタを用意しています。 このような体験がおありでしたら、是非教えてください。よろしくお願いいたします。

  • 親クラスのコンストラクタは? 引数付きコンストラクタは?

    VisualBasic.NETです。 あるクラスを継承したクラスからインスタンスを作成したときに、派生クラスのコンストラクタは呼び出されると思うのですが、基本クラスのコンストラクタはどうなるのでしょうか? JAVAのように、super() で呼び出す必要があるのでしょうか? 自動で呼び出されるのでしょうか? それとも、そもそも呼び出せないのでしょうか? また、引数の個数が違うコンストラクタは、同じクラス内に設定できるのでしょうか? JAVAのコードを移植しようと考えているのですが、出来るのかどうかが分からずに悩んでいます。 ご存じの方、よろしくお願いします。

  • コンストラクタの記述について ―引数を持ったクラスを継承する場合―

    コンストラクタの記述について ―引数を持ったクラスを継承する場合― ActionScript3.0でプログラミングをしています。 クラスの継承に挑戦したのですが、うまくいきません。 コンストラクタの記述は、何か特別なものが必要なのでしょうか? ■コンストラクタに引数なし → 成功。 ■コンストラクタに引数あり → 失敗。  エラー「No default constructor found in base class <親クラスの名前>」。 ■エラーの出るソース↓ ・Main.as(コンストラクタ内抜粋)     var parent:Parent = new Parent(100);     var child:Child = new Child(200); ・Parent.as package {   import flash.display.Sprite;      public class Parent extends Sprite {     protected var str:String = "親クラスのプロパティ";     public function Parent(inNum:Number):void {       trace("親クラス, ", str, inNum);     }   } } ・Child.as package {   import Parent;   public class Child extends Parent {     public function Child(inNum:Number):void { //■エラー。       trace("子クラス, ", str, inNum);     }   } } ご存知の方、よろしくお願いします。 よろしくお願いします!

    • ベストアンサー
    • Flash

専門家に質問してみよう