staticキーワードの意味と使用シナリオ
静的Java50のキーワードの一つです。静的キーワードは、メンバ変数を変更し、静的コードブロックのコードブロックを修正するために使用することができるグローバル静的メンバ変数、静的メソッドの改質方法を表します。(注:内部クラスに加えて、一般的なカテゴリを変更することはできません、これはなぜでしょうか?)
クラスA {
静的{
System.out.println(「A:コードの静的ブロック」)。
}
静的int型I; //静的変数
静的ボイド方法(){
System.out.println( "A:静的メソッド")。
}
}
要するに、staticキーワード変更内容は静的です。
静的、動的に相対的であり、動的がJVM上で実行するJavaプログラムを参照して、JVMが動的オブジェクトを作成し、オブジェクト(メモリ割り当て)必要な手順を記憶し、目標ミッションの後、オブジェクトは、ガベージコレクタ、すなわちメモリを破壊しますリサイクルJVM管理を統一し、他の新しく作成されたオブジェクトに割り当てられた、静的は、Javaプログラムが実行されていないことを意味し、JVMがロードされたクラスのためのストレージ・スペースを割り当てる静的キーワードの内容を変更し、このような静的メンバ変数として、JavaクラスローディングをJVMに、JVMがエリア内にクラスとクラスメソッドの静的メンバ変数を格納します、我々は、メソッド領域を知っているので、唯一の静的なキーワードに変更内容がグローバルに共有されている、そして、スレッドとまれGCの地域で共有されていますそれは、ストレージスペースが割り当てられます。
クラスに属しているとき、何かがオブジェクトのクラスに属していない、そしてそれは、オブジェクトによって共有されている場合ので、あなたは、静的なキーワードで修正するかどうかを検討することができます。
staticキーワードの役割
1つの変性ブロック
修飾された静的キーワードカテゴリコードブロックを使用してコードブロックと呼ばれるコードブロックのない静的キーワード変形例に静的コード、およびその逆と呼ばれます。
例えば、コードブロックは、各オブジェクトは、コードブロックの独自のインスタンスを持ってあるオブジェクトの作成と実行され、結果は、(メモリをそれが現在のオブジェクトの内容に影響を与えるサンプルコードのブロックを実行することであることを示し、及びオブジェクトの破壊と消滅します回復)と、クラスローディング動作がJVM間のみ起こるのでJVMのJavaクラスが、メモリにロードされたコードブロックを実行する静的ブロックは、静的コードブロックは、一度だけ実行されます。
コードの主な役割静的ブロックが複雑初期化に使用されているので、それが従う方法の領域に格納された静的クラスコードブロックを形成する量の記憶領域を初期化する過程で、すなわち、メソッド領域のコードの静的ブロックを格納した結果であるとスレッドで共有。
2修飾メンバ変数
静的メンバ変数が静的ローカル変数(なぜ?)ので、変更することはできませんという静的キーワード変更メンバ変数を持つクラス、だから、静的メンバ変数はまた、静的変数を参照することができます。同様のコードブロックと静的変数は、クラスがJVMのメモリにロードされ、JVMのメソッドに静的変数は、メモリ領域を確保し、またスレッドで共有されます。クラスの静的メンバ名の名前:フォームにアクセスします。
パブリッククラスStaticTest {
パブリック静的無効メイン(文字列[] args){
System.out.println(DI)。
System.out.println(新しいD()は、i。);
}
}
クラスD {
静的{
I = 2;
System.out.println( "D:コード1の静的ブロック")。
}
I int型の静的。
}
結果:
D:コード1の静的ブロック
2
2
静的変数は、情報クラスに格納され、スレッド間で共有することができ、もちろん、それはまた、各オブジェクトのクラスに属しているので、あなたがオブジェクトを介して静的変数にアクセスすることができますが、コンパイラがそうすることをサポートしていません、と警告を与えます。
注意:
静的荷重のシーケンスコード・ブロック・クラスとクラスの静的変数。静的変数の優先度クラスをロードし、次にコードの静的ブロックが、複数のコードブロックをロードし、静的変数の複数の書き込み順序でロードされます。
クラスD {
静的{
I = 2;
System.out.println( "D:コード1の静的ブロック")。
}
静的{
I = 6;
System.out.println( "D:コード2の静的ブロック")。
}
I int型の静的。
}
あなたは営業成績を考えることができます。
静的変数は明示的に初期化することができない、JVMは、それぞれのデフォルト値にデフォルト設定されます。バイトの基本データ型は0であるとしてcharがU0000を\され、0と短く、int型は0L、は0.0fにフロートは、0.0d二重、ブール値がfalseで、統一された参照型がnullである限り、0です。
静的変数が共有JVMメモリであり、それへのアクセスがスレッドBがその値を取得しながら、セキュリティスレッドが(リライトスレッド引き起こす可能性が、変更することができるので、取得値は修正または変更前の値でありますそれが?)、静的変数の使用は、マルチスレッドを検討する中ので。あなたは静的変数を変更することができないことを確認することができます場合は、スレッドの安全性の問題の使用を回避するために、一緒に、最終的なキーワードを使用することができ、それ以外の場合は、同期的には、このような揮発性のキーワードと一緒に使用など、スレッド安全性の問題を、使用する必要性を避けるために。
キーは、静的ローカル変数、インスタンスメソッドと静的メソッドを変更することができない、またはstaticキーワードの本来の意図はします - 反対共有します。
3つの変更方法
そうでない場合は、インスタンスメソッドとして知られている静的メソッドと呼ばれる静的キーワード改良法です。クラス名によって呼び出されたメソッド名が、静的メソッドは、他の静的変数およびクラスの静的メソッドを呼び出すことができることに注意し、直接(オブジェクトを介して呼び出していない限り)メンバ変数とインスタンスメソッドを呼び出すことはできません。
クラスD {
静的{ http://www.csjlyyfk.com/無錫婦人科診察
I = 2;
System.out.println(「D:コードの静的ブロック」)。
}
static final int型I;
int型J。
静的ボイド方法(){
System.out.println(I);
System.out.println(新しいD()J。);
法1();
新しいD()方法2()。
}
静的ボイド法1(){
System.out.println(I);
}
ボイド方法2(){
System.out.println(I);
}
}
下クラスのインスタンスメソッドは、オブジェクトにアクセスするために呼び出す必要があるので:?注意、および静的メソッドは、直接クラス名を介してアクセスすることができ、その後、展開サーバーのケースを考慮していない、クラスでは、それが最も可能性が高い「クラスで開始する方法であります名前。静的メソッドは、「私はできるだけ多くの静的メソッドを定義するJavaを起動し、JVMは、メインの入り口にそれを知っている方法ですか?
おそらくあなたは、mainメソッドを考えます。
はい、それは、Java仕様は、メインのJavaクラスへの入口を画定する主な方法です。オープンする主な方法で実行するJavaクラス:
パブリック静的無効メイン(文字列[] args){
(文字列引数:引数)のために{//パラメータ外周によって規定されます
System.out.println(引数)。
}
}
別のmainメソッドがオーバーロードすることができます。しかし、Javaはプログラムの名前、それだけでメソッド規定入り口で、メインのキーワードではないことに注意してください。
staticキーワードは、一般的なカテゴリを変更することはできませんが、それは内部クラスの静的内部クラスになるように、あなたはstaticキーワードを変更使用することができます注意してください。キーワード自体の静的な意味が共有され、JVMメモリ領域法にロードされたJavaクラスは、また、スレッドによる静的なキーワードでの一般的なカテゴリを変更するので、必要性を全く共有されません。
4つの静的インポート
インポートまたはインポートクラスで被覆された場合、静的インポートを表す静的パッケージ名またはクラスを修正することができます。静的インポートは、理解を深めて動的なインポートと比較して配置することができます。
あなたがプログラムを実行する必要がある場合、動的インポートがあり、クラスのこのパッケージでは、新たな対象ではない、クラスは、クラスをロードするために完全なパス名に基づいて行われます。そして、静的インポートがロードされたクラスと静的インポートの種類がロードされているので、事前に輸入します。
パブリッククラスStaticTest {
静的ボイド法1(){
System.out.println( "静的法1");
}
静的ボイド方法2(){
System.out.println( "静的法2");
}
}
静的インポート:
輸入静的com.starry.staticImport.StaticTest.method1。
パブリッククラスクライアント{
パブリック静的無効メイン(文字列[] args){
法1(); //
StaticTest.method2();
}
}
注法1()静的な輸入品である、それはクラス名でアクセスできる必要はありません、と法2()がインポートされていない、あなたはクラス名の呼び出しを渡す必要があります。だから、静的インポートそれを必要とするとき?
静的列挙法を含む等静的及び静的クラスをインポートするために使用される方法が導入された、またはクラス情報への情報の方法は、コンパイル時に決定されてもよいです。
staticキーワードの欠点
パッケージングは、Javaクラスとオブジェクト指向の主な機能の3つの機能の一つです。クラスコードおよび静的キーワードの方法で極力改変する変数に加えてUtilsの、オブジェクトクラスノー直接、クラス属性及びメソッドにアクセスすることができないクラスカプセルの破壊のこの種のため。