• ベストアンサー

class Test_A {  main(){}}の実行順序は?

public class Test_A { public static void main(){ int a = 0; int b = 1; } } 例えば上のようなサンプルで何故 main()がクラスTest_A の中に挟まっているのでしょうか?実行順序としては main()が終了したら、クラスTest_A の方はどうなるのでしょうか? main()からプログラムが始まるのは分かるのですが、その後の動作が分かりません。よろしくお願いします。 

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

  • ベストアンサー
  • neko_noko
  • ベストアンサー率45% (146/319)
回答No.1

>main()がクラスTest_A の中に挟まっているのでしょうか Javaは、全てのプロパティ、メソッドはどこかのクラスに属していないといけないからです。 mainメソッドであっても例外ではありません。 >main()からプログラムが始まるのは分かるのですが、その後の動作が分かりません。 これを考える上で最も重要なのはmainメソッドがstaticであることです。 staticなメソッドは、そのクラスのインスタンスを作らなくても、 つまり、new Test_A();としなくても実行することが可能です。 プログラム実行時には、Test_Aクラスのインスタンスは生成されません。 質問のコードでは変数a,bに値が代入され、それで終わりです。 Javaでは、(正確にはJavaVMは)実行するclassファイルにある、 String[]引数を持ったvoid mainメソッドを実行する仕様になっています。 しかし、mainメソッドを実行するときには何のインスタンスも生成されていないので、 何かのインスタンスのメソッドを実行することはできません。 なので、staticなメソッドでないとJavaVMが実行できないのです。 さらに、JavaVMからアクセス可能なスコープを与える必要があるので、 publicである必要もあるのです。 あとは、そのmainメソッドに指定されたコードを実行し、mainメソッドの最後まで処理が進んだら そこでJavaVMが終了し、プログラムも終了します。 ※細かい話ですが、main()からプログラムは始まりません。 正確に言うと、引数なしのmain()メソッドは他のメソッドと何ら代わりがありません。 プログラムを始めるには、 アクセススコープがpublicで、staticな戻り値のなく、引数にString配列を取るmainメソッド であることが必要です。つまり、 public static void main(String[] args) とするのが通常です。 試しに質問のコードをjavaコマンドで実行すると、NoClassDefFoundErrorが出るはずです。

その他の回答 (1)

  • i2719
  • ベストアンサー率35% (11/31)
回答No.2

Javaは、マルチスレッドのプログラムです。 実行開始時点ではスレッドは1本で、メソッドmainを実行します。 スレッドの実行の途中で、別のスレッドを生成することが可能です。 この場合、スレッドの本数が2本以上となります。 ここでメソッドmainを終了したら、最初のスレッドがなくなります。 スレッドの本数は1本少なくなりますが、まだ1本以上あればプログラムは終了ません。

参考URL:
http://www.itarchitect.jp/technology_and_programming/-/10943-1.html

関連するQ&A

専門家に質問してみよう