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 でなければならないのです。