- - PR -
コンストラクタとMAINメソッドの違い
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-04-25 09:24
コンストラクタとMAINの違いについて教えていただきたいのですが、私が読んだ本では
両方とも「クラスが作成されたときに実行されるメソッド」この2つにはどのような違いがあるのでしょうか。 それとも使い分けがあるのでしょうか。 ご存知の方教えていただけないでしょうか。 よろしくお願いいたします。 | ||||||||
|
投稿日時: 2005-04-25 09:57
えーと、mainの方はインスタンスの生成時ではなく、VMが起動された時に指定したクラスのmainメソッドが呼び出される。というものです。
対して、コンストラクタはインスタンスの生成時に呼び出すものなので、これらは同じものではありません。 コンストラクタはクラスをnewする度に何度でも呼びますが、mainは(自分で明示的に呼ばない限り)起動時に呼び出されるだけのものです。 多分、北斗さんの読んだ本ももう一度読み返して頂ければ、このあたりのことは書いてあると思いますよ。 | ||||||||
|
投稿日時: 2005-04-25 19:50
その本かなり嘘つきですね。。。焚書しましょう。。。
mainメソッドと言っても、public static void main(String[])でなければ、 VM起動時の起動対象のメソッドにはなりません。 クラスの実行にインスタンスの生成は行わないのでstaticメソッドになっています。 ただのメソッドなので、実行中でも他のクラスのmainメソッドを実行することもできます。 #自分自身を実行したら、再帰を抜ける処理を入れないと #無限再帰になってスタックオーバーフローになります。 「クラスが作成される」と言う表現もおかしいです。 クラスが作成されるというのは、 javacでjavaファイルが正常にコンパイルされた事と、 バイト列からClassのインスタンスが生成された事を 意味する事になります。 北斗さんの場合、「インスタンスが作成される」という表現が適切です。 インスタンスが作成される時にコンストラクタが呼び出されます。 コンストラクタが存在しない場合、コンパイラによって 勝手に引数なし・本体なしのコンストラクタが作られます。 ですので、コンストラクタが存在しなくても[new Hoge();]と記述できるわけです。 本題から少しそれてしまいましたね・・・ | ||||||||
|
投稿日時: 2005-05-02 03:33
その本はちょっとやばいですね。書名を出して吊るし上げましょう(・∀・)アヒャ!!
北斗さんは初心者さんなようなので、厳密さよりもわかりやすさを優先して書きますね。 コンストラクタはクラス1つにつき1つ作れます。 また作らなくてもかまいません。 そのクラスが実体化されたとき(newされたときとか)自動的に実行されます。 ですから変数の初期化とか、そのクラスの実体を使用するときの前準備のプログラムを書いておきます。 mainはプログラムに1つにつき1つ作ります。 かならずプログラムには1つ必要です。 そのプログラムが実行されたとき、mainから処理が始まります。 もしかしたら、北斗さんは今は1つ(または2つ)のクラスでプログラミングの勉強をされているのかもしれません。 そういう場合はピンとこないかもしれませんが、複数のクラスを扱うようになれば、この辺の違いはおのずとわかってくると思います。 | ||||||||
|
投稿日時: 2005-05-09 10:32
勘違いして覚えられても困りますので、ちょっとばかり突っ込みを・・
>コンストラクタはクラス1つにつき1つ作れます。 >また作らなくてもかまいません。 引数なしのコンストラクタはひとつですが、引数をとるようなコンストラクタが複数作れます。 作らなくてもいいというのは(前述されているように)、引数なしの(publicの)コンストラクタは、生成されていることになっているためです。 >mainはプログラムに1つにつき1つ作ります。 >かならずプログラムには1つ必要です。 >そのプログラムが実行されたとき、mainから処理が始まります。 (ただのメソッドではなく)いわゆるメインメソッドというのは、特に1プログラムに 1つに限る必要はないですよ。結果的に「最終的に動作させるメインがひとつになる」ことにはなりますが。 また、必ず作る必要はありません。 WEBサービス(サーブレットなど)とかでは必要ないときがありますよ。 細かい?ですがつっこみでした。 | ||||||||
|
投稿日時: 2005-05-09 12:17
さらに細かいツッコミですが・・・。
引数なしのデフォルトコンストラクタが作成されるのは、明示的に一切のコンストラクタを作成しなかった場合に限られます。たとえば Hoge(String arg) というコンストラクタを明示的に作成した場合は、引数なしのデフォルトコンストラクタ Hoge() は自動作成されなくなります。
エントリポイント main は 1つ以上必要です。汎用のクラスライブラリなんかだと各クラスに main があって、そこから起動すると、そのクラスのテストコードやサンプルが動くものがあったりしますね。 余計、混乱させてしまったらスミマセン。 |
1