static は「グローバル」または「静的」を意味し、メンバー変数およびメンバー メソッドを変更するために使用され、静的コード ブロックを形成することもできますが、Java 言語にはグローバル変数の概念がありません。
static によって変更されたメンバー変数とメンバー メソッドは、クラスのオブジェクトから独立しています。つまり、クラスの特定のインスタンスに依存せず、クラスのすべてのインスタンスによって共有されます。
このクラスがロードされている限り、Java 仮想マシンはデフォルトでクラス名に基づいてランタイム データ領域のメソッド領域でそれらを見つけることができます。したがって、静的オブジェクトは、そのオブジェクトが作成される前でも、オブジェクトを参照せずにアクセスできます。
public で変更された静的メンバー変数とメンバー メソッドは、本質的にはグローバル変数とグローバル メソッドです。そのクラスのオブジェクトが宣言されると、静的変数のコピーは生成されませんが、クラスのすべてのインスタンスは同じ静的変数を共有します。
静的変数の前にプライベート変更を加えることができます。つまり、この変数はクラスの静的コード ブロック、またはクラスの他の静的メンバー メソッドで使用できます (もちろん、非静的メソッドでも使用できます)。メンバーメソッド) ですが、他のクラスでは使用できません。クラス名を直接参照することが重要です。実際、プライベートはアクセス許可の制限を意味し、静的はインスタンス化せずに使用できることを意味し、理解しやすいことを理解する必要があります。 static の前に他のアクセス許可キーワードを追加しても効果は同じです。
静的によって変更されたメンバー変数およびメンバー メソッドは、通常、静的変数および静的メソッドと呼ばれます。アクセス構文は次のとおりです。
クラス名。静的メソッド名(パラメータリスト...)。
クラス名.静的変数名
static で変更されたコード ブロックは、静的コード ブロックを表します。Java 仮想マシン (JVM) がクラスをロードすると、そのコード ブロックが実行されます (非常に便利です (笑))。
1. 静的変数
クラスメンバ変数は、静的であるかどうかに応じて、静的変数またはクラス変数と呼ばれる静的によって変更される変数と、インスタンス変数と呼ばれる静的によって変更されない変数の 2 種類に分類されます。
2 つの違いは次のとおりです。
静的変数の場合、メモリ内にコピーは 1 つだけあります (メモリを節約するため)。JVM は静的変数にメモリを 1 回だけ割り当てます。静的変数のメモリ割り当ては、クラスのロード中に完了します。クラス名 (便利です) もちろん、オブジェクトを通じてアクセスすることもできます (ただし、これはお勧めしません)。
インスタンス変数の場合、インスタンスが作成される前に、インスタンス変数にメモリが 1 回割り当てられます。インスタンス変数は、相互に影響を与えることなくメモリ内に複数のコピーを持つことができます (柔軟)。
したがって、次の 2 つの関数を実装する必要がある場合は、通常、静的変数が使用されます。
1).オブジェクト間で値を共有する場合
2).変数へのアクセスが便利な場合
2. 静的メソッド
静的メソッドはクラス名を通じて直接呼び出すことができ、任意のインスタンスを呼び出すこともできます。
したがって、 this キーワードと super キーワードは静的メソッドでは使用できず、それらが属するクラスのインスタンス変数とインスタンス メソッドに直接アクセスすることはできません (つまり、静的メンバー変数とメンバー メソッドのみ)。それらが属するクラスのメンバー メソッドにアクセスできます。
インスタンスのメンバーは特定のオブジェクトに関連付けられているためです。これは暗記するのではなく、理解して理解する必要があります。 ! !
静的メソッドはインスタンスから独立しているため、静的メソッドは実装する必要があり、抽象化することはできません。
たとえば、メソッドの呼び出しを容易にするために、Java API の Math クラスのメソッドはすべて静的であり、一般クラス内の静的メソッドも他のクラスがメソッドを呼び出すのを容易にします。
静的メソッドは、クラス内の特別なタイプのメソッドです。クラス内のメソッドは、通常、必要な場合にのみ静的として宣言されます。
3. 静的コードブロック
静的コード ブロックは、クラス メンバーから独立したクラス内の静的ステートメント ブロックであり、メソッド本体のどこにでも配置できます。 JVM がクラスをロードするときに実行されます。複数の静的コード ブロックがある場合、JVM はクラス内に出現する順序でそれらを実行し、各コード ブロックは 1 回だけ実行されます。例えば:
パブリッククラス Test5 { プライベート int b; Test5.out.println(); println(tb); } static{ System.out.println(a) } public static void main(String[] args);メソッド スタブを自動的に生成する } static{ Test5.a=5; System.out.println(a) } public void f(){ System.out.println("hahhahah");
実行結果:
3
ハハハハ
1000
4
5
静的コード ブロックを使用して、いくつかの静的変数に値を割り当てることができます。最後に、これらの例には静的 main メソッドがあり、JVM は main メソッドの実行時にインスタンスを作成せずにそれを直接呼び出すことができます。 。
4. static と Final を一緒に使用すると、どういう意味になりますか?
static Final はメンバー変数とメンバー メソッドを変更するために使用されます。これらは単に「グローバル定数」として理解できます。
変数の場合、これは、値が与えられると変更できず、クラス名を通じてアクセスできることを意味します。
メソッドの場合、オーバーライドできず、クラス名を通じて直接アクセスできることを意味します。
場合によっては、そのクラスのオブジェクトから完全に独立して使用できるように、クラス メンバーを定義したい場合があります。通常、クラス メンバーにはそのクラスのオブジェクトを通じてアクセスする必要がありますが、特定のインスタンスを参照せずに単独で使用できるメンバーを作成することもできます。このようなメンバーは、メンバーの宣言の前にキーワード static (static) を追加することで作成できます。メンバーが静的として宣言されている場合は、そのクラスのオブジェクトが作成される前に、オブジェクトを参照することなくアクセスできます。メソッドと変数の両方を静的として宣言できます。静的メンバーの最も一般的な例は main() です。 main() はプログラムの実行開始時に呼び出す必要があるため、静的として宣言されます。
static として宣言された変数は、本質的にはグローバル変数です。オブジェクトが宣言されるとき、静的変数のコピーは生成されませんが、クラスのすべてのインスタンス変数は同じ静的変数を共有します。静的として宣言されたメソッドには次の制限があります。
1).他の静的メソッドのみを呼び出すことができます。
2).静的データのみにアクセスできます。
3). いかなる方法でも this または super を参照することはできません (キーワード super は継承に関連しており、次の章で説明します)。
計算によって静的変数を初期化する必要がある場合は、静的ブロックを宣言できます。静的ブロックは、クラスのロード時に 1 回だけ実行されます。次の例は、静的メソッド、いくつかの静的変数、および静的初期化子ブロックを含むクラスを示しています。
// 静的変数、メソッド、およびブロックを示します。 class UseStatic { static int a = 3; static void meth(int x) { System.out.println("x = " + x); println("a = " + a); System.out.println("b = " + b); } static { System.out.println("静的ブロックが初期化されました。"); public static void main(String args[]) { meth(42) } }
UseStatic クラスがロードされると、すべての静的ステートメントが実行されます。まず、a が 3 に設定され、次に静的ブロックが実行され (メッセージの出力)、最後に b が a*4 または 12 に初期化されます。次に main() が呼び出され、main() が meth() を呼び出し、値 42 を x に渡します。 3 つの println () ステートメントは、2 つの静的変数 a および b とローカル変数 x を参照します。
注: 静的メソッドでインスタンス変数を参照することは違法です。
このプログラムの出力は次のとおりです。
次のようにコードをコピーします。
静的ブロックが初期化されました。
x = 42
a=3
b = 12
静的メソッドと変数は、それらが定義されているクラス外のオブジェクトとは独立して使用できます。この方法では、クラス名の後にドット演算子を追加するだけです。たとえば、クラスの外部から静的メソッドを呼び出したい場合は、次の一般的な形式を使用できます。
次のようにコードをコピーします。
クラス名.メソッド()
ここで、classname は、静的メソッドが定義されているクラスの名前です。ご覧のとおり、この形式は、オブジェクト参照変数を介して非静的メソッドを呼び出す形式に似ています。静的変数には、クラス名の後にドット演算子を付けた同じ形式でアクセスできます。これは、Java がグローバル関数とグローバル変数の制御されたバージョンを実装する方法です。
以下に例を示します。 main() では、静的メソッド callme() と静的変数 b がクラスの外でアクセスされます。
クラス StaticDemo { static int a = 42; static int b = 99; static void callme() { System.out.println("a = " + a) } } クラス StaticByName { public static void main(String args[]) { StaticDemo.callme(); System.out.println("b = " + StaticDemo.b);
このプログラムの出力は次のとおりです。
次のようにコードをコピーします。
a=42
b = 99
静的メンバーには、そのクラスによって作成されたインスタンスからアクセスできません。
静的変更を行わないメンバーがオブジェクト メンバーである場合、それらは各オブジェクトによって所有されます。
static で変更されたメンバーはクラス メンバーです。つまり、クラスから直接呼び出すことができ、すべてのオブジェクトに共通です。