- ベストアンサー
コンストラクタの使い方?
僕はまだ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クラスのコンストラクタの定義には説明はあるものの、実行処理するための定義がされていないような気がするんですけども・・・。まだ僕はオブジェクト指向というものを理解できていないから、このようなわけのわからない質問をしている(と思う)のですが、よろしければどなたか分かりやすく教えてください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
最初に、へんなことを回答していたらすみません。(先に謝っておこう・・・(^^ゞ) まず、前者のクラスAですがAクラスのなかでBクラスという子供のクラスを作成しています。 おそらくAクラス内ちょっと手を加えた(継承した)FrameBクラス を使用したかったのでしょう。そこにはありませんがAクラスの コンストラクタが本当はあるはすです。 後者のCarクラスはCarクラスのコンストラクタが記述してありますね。 迷ってしまったのは前者にAクラスのコンストラクタがなかったからじゃないかなと思いますが間違っていますか? また「実行処理するのための定義」というお話がありますが、コンストラクタ内はそう考えるよりも 「クラス自身がとりあえず最初にしておくことを書く」 と考えたほうがいいと思います。本来ユーザ(PGを作る人) はコンストラクタ内をそれほど意識する必要がないからです。 例えばFrame( String title )を考えてみましょう。 Frame frame = new Frame( "たいとる君" ); としたら新しく作られるframeのタイトルは「たいとる君」になります。 ここでの「とりあえずしておくこと」は「とりあえずタイトルをつけておこう」と言うことになります。 ユーザはどうやってタイトルが「たいとる君」にセットされるのかは 深く知る必要がなく「このコンストラクタを実行すれば勝手にタイトルがセットされるのだ ということさえ知っておけばいいのです。 ちなみにコンストラクタ内の定義などを知りたい場合はJBuilderなんかを使うとクラス内に 何が書いてあるのか見えちゃったりすると思いました。 (もっといい方法があるかも&うそだったすいません)
その他の回答 (1)
- xinman
- ベストアンサー率30% (25/83)
質問拝見させていただきました。 現役の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を使用しています。
補足
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では、先ほど述べたようなことしか書かれていなくてコンストラクタの定義らしい定義が見つからないのですが・・・。
補足
たいとる君、分かりやすい例ですね。(笑) なるほど、実行処理するための定義はそれほど気にしなくてもよかったんですね。でも、やっぱり気になる。(笑) xinmanさんのおかげでFrameクラスのコンストラクタの定義が具体的にどのように記述されているのかがわかりました。そして実際にコンストラクタを使う際にはそれほどコンストラクタを意識しなくても良いのだということがct27さんのご説明でわかりました。たぶん理解できたは思いますが、また同じ所でつまずいてしまったら再び似たような質問をさせていただくことと思います。その時はどうぞよろしくお願いします。