Java静的キーワードとJava静的変数と静的メソッド
静的修飾子は、変数とメソッドで使用して、「静的」であることを示します。
静的変数と静的メソッドにクラス名を介してアクセスでき、クラスの静的メンバーにアクセスするためにクラスのオブジェクトを作成する必要はないため、静的で変更されたメンバーはクラス変数とクラスメソッドとも呼ばれます。静的変数はインスタンス変数とは異なり、インスタンス変数はオブジェクト間で値が異なるため、オブジェクトから常にアクセスされます。
次の例をご覧ください。
Public Class Demo {static int 10; i); new demo();
実行結果:
クラス変数i = 10インスタンス変数j = 20
静的メモリ割り当て
静的変数はクラスに属し、独立したオブジェクトに属していないため、クラスのインスタンスを作成せずに静的変数にアクセスできます。この結果は、コンパイラがクラス全体の静的変数のコピーのみを作成するためです。つまり、1つのメモリ空間のみが割り当てられます。インスタンスは、オブジェクトが作成されるたびに、異なる変数のメモリが互いに依存しないようにします。
次のコードをご覧ください。
パブリックデモ{string j; ; system.out.println( "obj1.i =" + obj1.i + "、obj1.j); obj2 .j = " + obj2.j);}}
実行結果:
obj1.i = 10、obj1.j = 20obj2.i = 10、obj2.j = 0
注:静的変数にもオブジェクトを介してアクセスできますが、推奨されず、コンパイラも警告を生成します。
上記のコードでは、Iはobj2を介してIの値を変更します。これは、OBJ1.IとOBJ2.Iが同じメモリ空間を指し、OBJ1.JとOBJ2.Jが異なるメモリスペースを指しているためです。
注:静的変数は、クラスがロードされると初期化されます。つまり、クラスがロードされている限り、この静的変数を使用するかどうかに関係なく初期化されます。
概要:クラス変数は、クラス変数のメモリが割り当てられると、このメモリ(クラス変数)が共有されます。変数の変更は、他のオブジェクトに影響します。外部からアクセスするには、オブジェクトを介したアクセスまたはクラス名を介してアクセスするには2つの方法があります。
静的メソッド
静的メソッドは、オブジェクト上で操作を実行できない方法です。たとえば、数学クラスのPOW()メソッドはMath.Pow(X、A)の構文を備えた静的方法であり、Xのaのパワーを計算するために使用され、数学を作成する必要はありません使用するとオブジェクト。
静的メソッドはオブジェクトを操作できないため、インスタンス変数に静的メソッドでアクセスできず、独自のクラスの静的変数のみにアクセスできます。
静的方法は、次の状況で使用できます。
メソッドはオブジェクト状態にアクセスする必要はなく、その必要なパラメーターは明示的なパラメーター(Math.Pow()など)によって提供されます。
メソッドは、クラスの静的変数にのみアクセスする必要があります。
読者は、Main()がどのオブジェクトでも動作しない静的な方法であることに気付いている必要があります。実際、プログラムの起動時にオブジェクトはありません。メイン()メソッドはプログラムへのエントリであり、プログラムに必要なオブジェクトが作成されます。
静的変数と静的メソッドの概要:
クラスの静的方法は、静的変数のみにアクセスできます。
クラスの静的方法は、非静的な方法を直接呼び出すことはできません。
アクセス制御許可が許可されている場合、静的変数と静的メソッドにもオブジェクトを介してアクセスできますが、推奨されません。
現在のオブジェクトは静的メソッドには存在しないため、これは使用できず、もちろんスーパーは使用できません。
静的方法は、非静的な方法で上書きすることはできません。
コンストラクターは、静的の宣言を許可していません。
ローカル変数は静的で変更できません。
静的方法の例:
パブリッククラスのデモ{static sum(int x、int y){return x + y; "10 + 10 =" + sum);
実行結果:
10+10 = 20
静的方法では、属するクラスのインスタンスは呼び出されないため、これに値がなく、インスタンス変数にアクセスできないため、コンパイルエラーが発生します。
注:インスタンス変数はオブジェクトからのみアクセスでき、クラスを通じてアクセスすることはできません。
静的イニシャルイザー(静的ブロック)
ブロックは、ブレースに囲まれたコードの一部です。静的初期イザーは、クラスおよびメソッドの外側に存在する静的ブロックです。静的初期化剤は、クラスがロードされたとき(クラスが初めて使用されたとき)に1回だけ実行され、静的変数の初期化に使用されることがよくあります。
サンプルコード:
public class demo {public static static {i = 10; " + i);} public static void main(string [] args){system.out.println(" demo.i = " + demo.i); new demo()。test();}}}
操作の結果は次のとおりです。
static block.demo.i = 10testメソッド:i = 10
静的インポート
静的インポートは、静的変数と静的クラス方法のインポートに使用されるJava 5の新機能です。
一般的に、これをインポートクラスで書きます。
PackageName.classNameをインポートします
または
パッケージネームをインポートします
そして、静的なインポートは次のように書くことができます:
Static PackageName.classname.methonnameをインポートします
または
Static PackageName.className。*; //クラス内のすべての静的メンバーをインポートします
インポート後、現在のクラスにメソッド名を使用して静的メソッドを直接呼び出すことができ、ClassName.methodNameを使用してアクセスする必要がなくなります。
頻繁に使用される静的変数と静的メソッドの場合、それらは静的にインポートできます。静的なインポートの利点は、出力ステートメントSystem.out.println()などの操作を簡素化できることです。次回は直接。
次のコードをご覧ください。
Static Java.lang.system。*; Import static Java.lang.math.random; public class demo {public static void main(string [] args){out.println( "random数:" + random(){out.println( " );
実行結果:
生成された乱数:0.05800891549018705
Javaの最終キーワード:Javaのブロック継承と多型<BR />クラス、変数、メソッドを宣言すると、キーワードファイナルを使用して変更できます。ファイナルによって変更されたデータには、「最終状態」の特性があり、「最終」を意味します。特定の規制は次のとおりです。
ファイナルによって変更されたクラスを継承することはできません。
最終的な変更方法は、サブクラスで書き換えることはできません。
Final(メンバー変数またはローカル変数)によって変更された変数は定数になり、1回しか割り当てられません。
ファイナルによって変更されたメンバー変数は、宣言と同時に割り当てられなければなりません。使用済み。
ファイナルによって変更されたローカル変数は、割り当てられないことを宣言し、一度に割り当てられます。
ファイナルは一般に、数学的三角形の方法、指数操作、その他の機能を実装する方法、および数学定数π= 3.141593、E = 2.71828 et al。
実際、最終状態を確保するために、上記の方法と定数を提供するJava.lang.mathクラスも最終として定義されています。
タイプ(任意のクラスのタイプ)を参照する変数が最終としてマークされている場合、変数は他のオブジェクトを指すことができないことに注意する必要があります。ただし、参照自体のみが最終的なものであるため、オブジェクトのコンテンツを変更できます。
変数が最終的にマークされている場合、結果はそれを一定にすることです。最終変数の値を変更したいと思うと、コンパイルエラーが発生します。最終変数を正しく定義する例は次のとおりです。
Public final int max_array_size = 25;
定数は最終的な変更があるため、継承することはできません。
次のコードをご覧ください。
Public Final Class Demo {Public static int total_number = 5; = ++ string} string [] {final demo()二次割り当てを実行}}
ファイナルは、クラスを変更するために使用して、クラスがサブクラスの導出を防ぐこともできます。これはセキュリティ上の理由で行われます。これは、文字列が参照されると、他のクラスの文字列ではなく、クラスの文字列の文字列である必要があることを確認する必要があるためです(文字列クラスは悪意を持って継承され、改ざんされている可能性があります)。
メソッドは最終的に変更でき、最終的に変更することはできません。変数は最終的に変更でき、最終的な変数はオブジェクトの作成後に値を変更することはできません。クラスが最終として宣言されると、そのクラスに含まれる方法も最終として暗黙的に宣言されますが、変数は変数ではありません。
最終的に変更されたメソッドは静的な結合であり、ポリモーフィズムを生成しません(動的バインディング)。実行時にメソッドテーブルを取得する必要はありません。 Javaでは、動的結合には意味がないため、静的またはプライベートによって変更される方法は最終として暗黙的に宣言されます。
動的結合はリソースを消費し、多くの場合必要ではないため、一部のプログラマーは、多型を使用するのに十分な理由がない限り、すべての方法を最終的に変更する必要があると考えています。
JVMのインスタントコンパイラは、プログラムの操作情報をリアルタイムで監視し、クラス間の継承関係を正確に知ることができるため、この理解は少し極端です。メソッドが上書きされず、短い場合、コンパイラはそれを最適化できます。これはインラインと呼ばれます。たとえば、e.getName()へのインライン呼び出しは、E.Name変数へのアクセスに置き換えられます。これは意味のある改善です。これは、メソッドを呼び出す命令を処理する際にCPUが使用する分岐転送がプリフェッチ命令のポリシーを破壊するため、これは人気がないと見なされるためです。ただし、getName()が別のクラスで上書きされている場合、コンパイラは上書きコードが何をするかを知ることができないため、インライン化することはできません。