main() にはいつも static という修飾子 modifier がついています。
class Hello { public static void main(String args[]) { System.out.println("こんにちは"); } }
static の有無のについての影響について、 次のprogrmを比較してみます。つぎの program
class Test { static int value; static void setValue(int x) { value = x; } public static void main(String args[]) { setValue(5); System.out.println("値は " + value + " です"); } }
を実行すると画面に「値は 5 です」と表示されます。
この program から static という modifier を外す実験をしてみます。 main() の頭の static は外すとエラーになりますので, 残りの二つを外して...
class Test { int value; void setValue(int x) { value = x; } public static void main(String args[]) { setValue(5); System.out.println("値は " + value + " です"); } }
この状態で保存し javac Test.java してみると、 次のような error message が出て、compileできません。
Test.java:7: Can't make static reference to method void setValue(int) in class Test. setValue(5); ^ Test.java:8: Can't make a static reference to nonstatic variable value in class Test. System.out.println("値は " + value + " です"); ^ 2 errors
この「Can't make a static reference」というのは、
static な method から static でないものを使えないよという意味の error message です。
static なものは、compileした時点で作成されます。 ところが、static でないものは、 実行時にはまだ存在しないので、new という命令で作らなければなりません。
上の program を正しくすると、次のようになります。
class Test { int value; void setValue(int x) { value = x; } public static void main(String args[]) { Test t = new Test(); // Test のinstance t を作る t.setValue(5); System.out.println("値は " + t.value + " です"); } }
new でできたものを、その class の instance といいます。 instance の作り方は、
class名 instance名 = new class名();
一つの class から複数の instance を作りだすことができます。
class Test { int value; void setValue(int x) { value = x; } public static void main(String args[]) { Test t = new Test(); // Test のインスタンス t を作る Test u = new Test(); // Test のインスタンス u を作る t.setValue(5); // t の value を 5 にする u.setValue(7); // u の value を 7 にする System.out.println("値は " + t.value + " です"); System.out.println("値は " + u.value + " です"); } }とすれば、
値は 5 ですと出力されます。
値は 7 です
このように、class の static でない部分は、 設計図や型紙や鋳型などにたとえられます。 それだけでは使えませんが、いくつでも instance を作り出すことができます。
main が最初から存在しなければ何もできないので、 main が static でなければならないのです。