具体的には、次のコードを試していました:
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
がわかりません。メンバーはメンバーを参照することしかできません。 インスタンス メンバーは、もちろんメンバーにアクセスできます。Hello
Clock
static
static
static
補足:もちろん、メンバーはオブジェクト参照を通じて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 つになることもありますが、これは重要ではありません。