クラス内の「static」キーワードは何をしますか? 質問する

クラス内の「static」キーワードは何をしますか? 質問する

具体的には、次のコードを試していました:

package hello;

public class Hello {

    Clock clock = new Clock();

    public static void main(String args[]) {
        clock.sayTime();
    }
}

しかし、エラーが発生し

静的メソッド main 内の非静的フィールドにアクセスできません

そこで、の宣言をclock次のように変更しました。

static Clock clock = new Clock();

そして、それはうまくいきました。そのキーワードを宣言の前に置くことはどういう意味でしょうか? それは具体的に何を実行し、そのオブジェクトに対して何ができるかという点で何を制限するのでしょうか?

ベストアンサー1

staticメンバーは特定のインスタンスではなくクラスに属します。

これは、クラスのインスタンスを100万個作成しても、フィールドのインスタンスは1つしかstatic存在しないことを意味します[1]。また、すべてのインスタンスで共有されます。

staticメソッドも特定のインスタンスに属していないため、インスタンス メンバーを参照することはできません。 示されている例では、クラスのどのインスタンス (つまり、クラスのどのインスタンス) を参照すべきかmainがわかりません。メンバーはメンバーを参照することしかできません。 インスタンス メンバーは、もちろんメンバーにアクセスできます。HelloClockstaticstaticstatic

補足:もちろん、メンバーはオブジェクト参照を通じてstaticインスタンス メンバーにアクセスできます。

例:

public class Example {
    private static boolean staticField;
    private boolean instanceField;
    public static void main(String[] args) {
        // a static method can access static fields
        staticField = true;

        // a static method can access instance fields through an object reference
        Example instance = new Example();
        instance.instanceField = true;
    }

[1]: 実行時特性に応じて、ClassLoader または AppDomain またはスレッドごとに 1 つになることもありますが、これは重要ではありません。

おすすめ記事