static 修飾子と new 演算子

static修飾子

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

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