• ベストアンサー

コンストラクタの使い方?

僕はまだJavaを勉強し始めて1ヶ月ぐらいの初心者なんですけども、現段階では基本的な文法を勉強し終えた(かなと思っている)ので、Swingのほうに早速とりかかりました。その際にすごく疑問に思ったことがあるので、皆さんにお尋ねします。 public class A ......main..... class B extends Frame{   public B(String stitle){    super(stitle);  } } super(stitle)のところでFrameクラスのコンストラクタが呼び出されていますよね。そこでFrameクラスのコンストラクタの定義を見てみると、僕が今まで学んできたような定義がなされていないんですけども。僕が今まで学んできたものというのは、 class Car {   private int num;   private double gas;   public Car()   {    System.out.println(車を作成しました。)   } } class C { ....main...   {    Car car1=new Car();   } } この場合の実行結果というのは、 「車を作成しました。」という文章が表示されはづですけど、これって言うのはSystem.out.println(車を作成しました。)のようにきちんと定義しているからですよね。それに対してFrameクラスのコンストラクタの定義には説明はあるものの、実行処理するための定義がされていないような気がするんですけども・・・。まだ僕はオブジェクト指向というものを理解できていないから、このようなわけのわからない質問をしている(と思う)のですが、よろしければどなたか分かりやすく教えてください。

  • Java
  • 回答数2
  • ありがとう数1

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

  • ベストアンサー
  • ct27
  • ベストアンサー率62% (48/77)
回答No.2

最初に、へんなことを回答していたらすみません。(先に謝っておこう・・・(^^ゞ) まず、前者のクラスAですがAクラスのなかでBクラスという子供のクラスを作成しています。 おそらくAクラス内ちょっと手を加えた(継承した)FrameBクラス を使用したかったのでしょう。そこにはありませんがAクラスの コンストラクタが本当はあるはすです。 後者のCarクラスはCarクラスのコンストラクタが記述してありますね。 迷ってしまったのは前者にAクラスのコンストラクタがなかったからじゃないかなと思いますが間違っていますか? また「実行処理するのための定義」というお話がありますが、コンストラクタ内はそう考えるよりも 「クラス自身がとりあえず最初にしておくことを書く」 と考えたほうがいいと思います。本来ユーザ(PGを作る人) はコンストラクタ内をそれほど意識する必要がないからです。 例えばFrame( String title )を考えてみましょう。 Frame frame = new Frame( "たいとる君" ); としたら新しく作られるframeのタイトルは「たいとる君」になります。 ここでの「とりあえずしておくこと」は「とりあえずタイトルをつけておこう」と言うことになります。 ユーザはどうやってタイトルが「たいとる君」にセットされるのかは 深く知る必要がなく「このコンストラクタを実行すれば勝手にタイトルがセットされるのだ ということさえ知っておけばいいのです。 ちなみにコンストラクタ内の定義などを知りたい場合はJBuilderなんかを使うとクラス内に 何が書いてあるのか見えちゃったりすると思いました。 (もっといい方法があるかも&うそだったすいません)

fumi11
質問者

補足

たいとる君、分かりやすい例ですね。(笑) なるほど、実行処理するための定義はそれほど気にしなくてもよかったんですね。でも、やっぱり気になる。(笑) xinmanさんのおかげでFrameクラスのコンストラクタの定義が具体的にどのように記述されているのかがわかりました。そして実際にコンストラクタを使う際にはそれほどコンストラクタを意識しなくても良いのだということがct27さんのご説明でわかりました。たぶん理解できたは思いますが、また同じ所でつまずいてしまったら再び似たような質問をさせていただくことと思います。その時はどうぞよろしくお願いします。

その他の回答 (1)

  • xinman
  • ベストアンサー率30% (25/83)
回答No.1

質問拝見させていただきました。 現役のJavaプログラマです。 早速Frameクラスの定義を見てみたのですが コンストラクタの部分だけ抜粋すると public class Frame extends Window implements MenuContainer { public Frame() { this(""); } public Frame(String title) { this.title = title; visible = false; setLayout(new BorderLayout()); weakThis = new WeakReference(this); addToFrameList(); } } このように記述されていました。 これって、”実行処理するための定義”だと思うんですけどfumi11さんはどう思われます? わからないところがあれば補足してください。 ちなみに私の使用している開発環境はVAJ3.5を使用しています。

fumi11
質問者

補足

JavaSoft社のHPを見てみると、Frameクラスのコンストラクタの詳細は次のように書かれていました。 Frame() 初期状態で可視ではない Frame の新しいインスタンスを生成します。 Frame(GraphicsConfiguration gc) スクリーンデバイスの指定した GraphicsConfiguration がある Frame を作成します。 Frame(String title) 指定されたタイトルで、初期状態で可視ではない新しい Frame オブジェクトを構築します。 Frame(String title, GraphicsConfiguration gc) 指定されたタイトルと GraphicsConfiguration で、最初は不可視である新しい Frame オブジェクトを構築します。 これを見て僕は思ったんですけども、Frame()の説明として「初期状態で可視ではない Frame の新しいインスタンスを生成します。」とは書いてあるものの、具体的な中身というか、実行処理するための定義がされてないではないか!!と思ったわけです。 でもxinmanさんのおかげで、Frameクラスのコンストラクタの定義がきちんとあることがわかりました。そこでお聞きしたいのですが、僕が使っているSDK1.3ではコンストラクタの定義をどうやって調べればいいのでしょうか?僕が調べたJavaSoft社のHPでは、先ほど述べたようなことしか書かれていなくてコンストラクタの定義らしい定義が見つからないのですが・・・。

関連するQ&A

  • 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!"); } } 

  • JAVAコンストラクタについて

    JAVA のコンストラクタ定義の際に、下記のようにコンストラクタにvoidを付けた時と付けない時の処理結果が変わるのはなぜでしょうか。 (1) class O { protected int d; O(){ System.out.println("O = " + d); } } class Study_6_3main_void { public static void main(String args[]) { int i = 1; O OO = new O(); System.out.println("O = "); } } (2) class O { protected int d; void O(){ System.out.println("O = " + d); } } class Study_6_3main_void { public static void main(String args[]) { int i = 1; O OO = new O(); System.out.println("O = "); } } 実行結果 (1) O = 0 O = (2) O = 以上です。回答の程よろしくおねがいします。

    • ベストアンサー
    • Java
  • コンストラクタからメソッドを呼んではいけない?

    会社の先輩から、 「コンストラクタでメソッドを呼ぶな!」をいわれ 理由も聞かずにソースを修正したのですが、 なぜコンストラクタからメソッドを呼んではいけないのでしょうか? 例: public class MyClass{ public MyClass(){ test(); } private void test(){ System.out.println("test"); } } よろしくお願いします。

    • ベストアンサー
    • Java
  • コンストラクタについて

    これも試験問題らしくて自分でやってみましたのであってるかどうか自信なくて どなたかみてみていただけたらと思います.よろしくお願いします。 下のソースファイルをコンストラクタを用いたものに修正しなさい class Sconst{ int x,y,z; void print(){ System.out.println(x); System.out.println(y); System.out.println(z); } } class ExConstTest{ public static void main (String[] args ){ Sconst sc=new Sconst(); sc.x=10; sc.y=30; sc.z=5; } } ------------------------------------------------------------- class Sconst{ int x,y,z; Sconst(){ x=10; y=30; z=5; } } class ExConstTest{ public static void main (String[] args ){ Sconst a1; Sconst a2; Sconst a3; a1=new Sconst(); a2=new Sconst(); a3=new Sconst(); System.out.println(a1.x); System.out.println(a2.x); System.out.println(a3.x); } }

    • ベストアンサー
    • Java
  • 「インターフェイス」って何の為に必要なんですか?

    “値を変更できるフィールドがもてない”・“抽象クラスしかもてない”のに何の為に記述するんだろう?と思って、インターフェイスを入力せずに実行してみたのですが、入力してもしなくても同じ結果が出ました。 同じ結果が出るならなぜ必要なんですか? ************* コード **************************************** //のりものインターフェイス interface iVehicle{ void vShow(); } //材料インターフェイス interface iMaterial{ void mShow(); } //車クラス class Car implements iVehicle,iMaterial{ private int num; private double gas; public Car(int n, double g){ num = n; gas = g; System.out.println("ナンバー"+ num + "ガソリン量" +gas + "の車を作成しました。"); } public void vShow(){ System.out.println("車のナンバーは" + num +"です。"); System.out.println("ガソリン量は" + gas + "です。"); } public void mShow(){ System.out.println("車の材質は鉄です。"); } } class Sample1{ public static void main(String[] args){ Car car1 = new Car(1234, 20.5); car1.vShow(); car1.mShow(); } } ************************************************************** <実行結果> 「ナンバー1234ガソリン量20.5の車を作成しました。  車のナンバーは1234です。  ガソリン量は20.5です。  車の材質は鉄です。              」 インターフェイスを記述してもしなくても、同じく上記の結果が 出ました。 ※ちなみに抽象クラスもいったい何なのかよく分りません。

    • ベストアンサー
    • Java
  • インターフェイスを2つ以上実装

    こんにちは。 高橋麻奈さん著の「やさしいJava」を使ってJavaを学んでいるのですが、インターフェイスのところでつまずいています。 インターフェイスは2つ以上クラスに実装できるということですが、本に書いてあるサンプル文では2つ実装されているものが載っています。 それにさらにもう一つインターフェイスを自分で書き加えて実装させてみたのですが、エラーが出てコンパイルできませんでした。書き加える前の状態では普通にコンパイル&実行できました。 ということは書き加えた部分が間違ってるはずなのですが自分には何処が間違っているのかわかりません。 以下にそのコード全文を載せておきますね。(色インターフェイス関連が書き加えた部分) どなたかわかるかたがいらっしゃいましたらご回答お願いします。 //のりものインターフェイス interface iVehicle { void vShow(); } //材料インターフェイス interface iMaterial { void mShow(); } //色インターフェイス interface iColor(); { void cShow(); } //車クラス class Car implements iVehicle, iMaterial, iColor { private int num; private double gas; public Car(int n, double g) { num = n; gas = g; System.out.println("ナンバー" + num + "ガソリン量" + gas + "の車を作成しました"); } public void vShow() { System.out.println("車のナンバーは" + num + "です"); System.out.println("ガソリン量は" + gas + "です"); } public void mShow() { System.out.println("車の材質は鉄です"); } public void cShow() { System.out.println("車の色は黄色です"); } } class Sample4 { public static void main(String args[]) { Car car1 = new Car(1234, 20.5); car1.vShow(); car1.mShow(); car1.cShow(); } }

    • ベストアンサー
    • Java
  • コンストラクタのオーバーロードについて

    class loo{ //フィールドの定義 int sland; //コンストラクタの定義1 loo(){ this.sland = 28; } //コンストラクタの定義2 loo(int sland){ this.sland = sland; } //メソッドの定義 void ken(){ System.out.println(this.sland); } } //mainメソッド class kkk{ public static void main(String args[]){ ---------------------------------------------- loo lo = new loo(); lo.ken(); lo.ken(100); ---------------------------------------------- } } コンストラクタのオーバーロードについて、伺いたいことがありますので掲載致しました。 今回は、kenメソッドを用いて変数slandに入っている値を表示するプログラムを作りたいと思っています。 コンストラクタのオーバーロードを利用するわけですが、プログラム実行後に 28 100 という風な出力結果を得ようと、上記のようなプログラミングを実施しました。 しかし、いざコンパイルをかけると java:27: ken() (loo 内) を (int) に適用できません lo.ken(100); ~ というエラーが表示されてしまいます。 ----でかっこってある部分に問題があるのはわかっているのですが、思うように結果を得ることができない状況です。 また、----の部分を、 loo lo = new loo(100); lo.ken(); lo.ken(); と、書き換えると出力結果は 100 100 と表示され、28が表示されなくなってしまいます。 お手数ですが、ご教授の程お願い致します。

  • Javaコンストラクタthisとsuperについて

    javaのthisとsuperの理解の為に下記のようなクラスで実験してみているのですが、 少し解らない箇所が出てきました。 コメントアウト行(1)に書いたようにsuper()を書くとエラーが発生してしまいます。 確かsuper()はコンパイラが自動的にコンストラクタが実行された時1行目に挿入している。 と覚えていたので明示的にしようとしたのですが、どうやら認識違いのようでして、だとしたら Q1:super()はいつ呼ばれているのでしょうか? また、ConstThisTestは暗黙的にObjectクラスを継承しているはずなので Q2:Objectクラスのコンストラクタが呼ばれているはずですが、 いつ呼ばれているかをログなどで確認する方法はありますでしょうか? 因みに開発環境はeclipseを使用しております。 尚javaのバージョンやeclipseのバージョン等は 今回は関係ないかなと思うので記載しておりません。 以上 何卒宜しくお願い致します。 --------------------------------------------------------- public class ConstThisTest { int constValue = 0 ; public ConstThisTest(int constValue) { this.constValue = constValue; } public ConstThisTest() {        /* (1)super()を書くとthis()は1行目にかかないと          コンストラクタ内の最初のステートメントであることが必要とエラーが出る。 */ this(-1); } public void printValue(){ System.out.println("constValue = " + constValue); } } public class ConstThisTestMain { public static void main(String[] args) { ConstThisTest ct = new ConstThisTest(); ct.printValue(); } }

    • ベストアンサー
    • Java
  • デフォルトコンストラクタについて

    クラスについて、デフォルトコンストラクタについて理解が乏しいのですが、クラスB側で何か細工をすると、クラスAのデフォルトコンストラクタ無しで、エラーなくコンパイルできるのでしょうか? 派生クラスの親のベースクラスのコンストラクタを呼ぶsuper?でOKなのでしょうか? #include "stdafx.h" class A { public: //A(){} // これをコメントアウトにすると // error C2512: 'B' : クラス、構造体、共用体にデフォルト コンストラクタがありません。 A(int x){} ~A(){}; }; class B : A { }; void main(void){ B b; }

  • コンストラクタの動作について

    下記のソースについて質問があります。 public class Test{ private String msg; public Test(){ this("Good morning"); } public Test(String msg){ msg = msg; } public String toString(){ /*(2)*/ return ("msg:" + msg); } public static void main(String args[]){ System.out.println(new Test()); /*(1)*/ } } このコードをコンパイルした出力結果は、 msg:null となるのですが、ここの仕組みがわかりません。 (1)でTestクラスのコンストラクタを呼び出し、msgに"Good morning"を設定し、 処理が終わると思うのですが、(2)の処理も行われてしまいます。 (1)では、Testのコンストラクタを設定しているだけに見えてしまうのですが、 (2)まで処理が行われるのは、何故かのかをご教授の程お願い致します。

    • ベストアンサー
    • Java

専門家に質問してみよう