新しい同僚、書き込みJavaメソッドは修正を通して静的であるが、それは必要としないという理由だけで、新しいオブジェクトを直接呼び出すことができます。クラスメソッドは、静的な修飾を有する何も間違っを抽象化し、一般的には、直接クラスに書くのではなく、それらのほとんどは、ツールutilに配置する必要があり、パブリックメソッドを抽象化。静的メソッドの静的な修飾は、簡単な通話だけでなく、高速ではなく、実際のプログラミングが、推奨されません。
静的メソッドは、より多くのメモリを取るので、これはありませんが、より良い実際のプログラミングに適用するために、我々は、原理を理解しているため。例えば、なぜ、時にはあなたはシングルトンではなく、静的メソッドを使用する必要がありますか?例えば、いくつかの構成およびロードの特性、必要性は、ライフサイクル全体を通じて存在するが、一方のみを維持する必要があるが、これらの構成及び特性は、オブジェクト指向の手法により得られる今、この時間は、単一の実施の形態を使用することが必要であり、ただし静的メソッドは解決することができますが、最良の実施の形態またはシングルモード。
だから、静的メソッドを使用するには?
1)従来法ツールでは、特定の実施例に依存しないが、高周波数の使用。
静的メソッドを直接パラメータとしてのインスタンスがない限り、任意の非静的メンバを使用できないので、「光」方法2)オブジェクトを必要としません。
だから、それを使用する方法をインスタンス化する必要がありますか?
マルチスレッドのシナリオでは、静的変数の静的メソッドの変更操作が簡単に、この時間は、あなたがインスタンスメソッドを使用する必要があり、スレッドの安全性の問題につながる可能性があるため、この方法は、あなたがインスタンスメソッドを使用する必要があり、クラスのオブジェクトに依存します。
public class TestStatic {
static class test {
//静态成员变量
static String a = "H";
//修改该静态成员变量
static void modify(String v) {
a = v;
}
}
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
new Thread(() -> {
test.modify(Thread.currentThread().getName());
System.out.println(Thread.currentThread().getName() + ":" + test.a);
}).start();
}
}
}
なぜ、上記の結果はありますか?
Javaメモリー・モデル、各オブジェクトは、静的クラスのメンバ変数は、.classファイルながら全てので、分類、対応するロック例示的なモニターを有することなどが格納されている例示的なヒープオブジェクト、静的メンバ変数、配列要素、静的方法上記、対象クラス変数を取得し、その後、複数のスレッドの場合には、参照の共有変数vに直接ポイントに相当つのスレッドを変更する場合、クラスの静的変数、および、他のISを取得することが可能です変数スレッドを変更した後、スレッド不安のこのような状況となるよう。
それでは、どのようにこの問題を解決するには?答えはロックされています。
public class TestStatic {
static class test {
// 静态成员变量
static String a = "H";
// 修改该静态成员变量
static void modify(String v) {
a = v;
}
}
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
new Thread(() -> {
synchronized (test.class) {
test.modify(Thread.currentThread().getName());
System.out.println(Thread.currentThread().getName() + ":" + test.a);
}
}).start();
}
}
}
输出:
Thread-4:Thread-4
Thread-7:Thread-7
Thread-6:Thread-6
Thread-5:Thread-5
Thread-1:Thread-1
Thread-2:Thread-2
Thread-0:Thread-0
Thread-3:Thread-3
Thread-9:Thread-9
Thread-8:Thread-8
もう一つの方法は、次のような静的メソッド、インスタンスメソッドの変更を、使用しないことです。
public class TestStatic {
public static void main(String[] args) {
test te = new test();
for (int i = 0; i < 10; i++) {
new Thread(() -> {
te.modify(Thread.currentThread().getName());
System.out.println(Thread.currentThread().getName() + ":" + te.a);
}).start();
}
}
}
class test {
// 静态成员变量
String a = "H";
public String getA() {
return a;
}
public void setA(String a) {
this.a = a;
}
public test(String a) {
super();
this.a = a;
}
public test() {
}
// 修改变量
void modify(String v) {
a = v;
}
}