非静的変数は静的メソッドでは使用できないと言われていますが、public static void mainは使用できますが、どうですか?
6 に答える
いいえ、そうではありません。
public class A {
int a = 2;
public static void main(String[] args) {
System.out.println(a); // won't compile!!
}
}
しかし
public class A {
static int a = 2;
public static void main(String[] args) {
System.out.println(a); // this works!
}
}
またはインスタンス化する場合A
public class A {
int a = 2;
public static void main(String[] args) {
A myA = new A();
System.out.println(myA.a); // this works too!
}
}
また
public class A {
public static void main(String[] args) {
int a = 2;
System.out.println(a); // this works too!
}
}
はa
ここではローカル変数であり、インスタンス変数ではないため、機能します。メソッドのローカル変数は、メソッドが実行中かどうかに関係なく、メソッドの実行中に常に到達可能ですstatic
。
はい、mainメソッドは非静的変数にアクセスできますが、実際のインスタンスを介して間接的にのみアクセスできます。
例:
public class Main {
public static void main(String[] args) {
Example ex = new Example();
ex.variable = 5;
}
}
class Example {
public int variable;
}
「非静的変数は静的メソッドで使用できない」と人々が言うとき、同じクラスの非静的メンバーに直接アクセスすることはできません(たとえば、 Keppilsの回答に示されているように)。
関連する質問:
アップデート:
非静的変数について話すとき、1つは暗黙的にメンバー変数を意味します。(ローカル変数はとにかく静的修飾子を持つことができないので。)
コード内
public class A {
public static void main(String[] args) {
int a = 2;
System.out.println(a); // this works!
}
}
ローカル変数を宣言しています(静的修飾子がない場合でも、通常、非静的変数とは呼ばれません)。
メイン メソッドは、非静的メンバーにもアクセスできません。
final public class Demo
{
private String instanceVariable;
private static String staticVariable;
public String instanceMethod()
{
return "instance";
}
public static String staticMethod()
{
return "static";
}
public static void main(String[] args)
{
System.out.println(staticVariable); // ok
System.out.println(Demo.staticMethod()); // ok
System.out.println(new Demo().instanceMethod()); // ok
System.out.println(new Demo().instanceVariable); // ok
System.out.println(Demo.instanceMethod()); // wrong
System.out.println(instanceVariable); // wrong
}
}
これは、デフォルトで、メソッドまたは変数を呼び出すと、実際にはthis.method()
または this.variable にアクセスしているためです。しかし、main() メソッドまたはその他の静的な method() では、「this」オブジェクトはまだ作成されていません。
この意味で、静的メソッドは、それを含むクラスのオブジェクト インスタンスの一部ではありません。これがユーティリティ クラスの背後にある考え方です。
静的コンテキストで非静的メソッドまたは変数を呼び出すには、最初にコンストラクターまたはファクトリを使用してオブジェクトを構築する必要があります。
より深い:
基本的に、静的メンバー (メソッドとフィールド) をインスタンス メンバーであるかのように参照できる Java IMO の設計上の欠陥です。これは、次のようなコードでは非常に混乱する可能性があります。
Thread newThread = new Thread(runnable);
newThread.start();
newThread.sleep(1000);
新しいスレッドをスリープ状態に送っているように見えますが、実際には次のようなコードにコンパイルされます。
Thread newThread = new Thread(runnable);
newThread.start();
Thread.sleep(1000);
現在のスレッドをスリープ状態sleep
にするだけの静的メソッドであるためです。
実際、変数は非nullityについてもチェックされていません(これ以上;以前はそうだったと思います):
Thread t = null;
t.sleep(1000);
一部の IDE は、このようなコードに対して警告またはエラーを発行するように構成できます。読みやすさが損なわれるため、実行しないでください。(これは C# で修正された欠陥の 1 つです...)
次のような静的メソッドで非静的参照を作成できます。
static void method() {
A a = new A();
}
public static void main(String[] args)
メソッドの場合と同じこと