1. 静的メソッドとの比較
通常の状況では、プロジェクトの開始時に一部のコードを実行する必要がある場合、この種のコードはプロジェクトの開始時にアクティブに実行される必要があります。オブジェクトを作成せずに、他のプログラムから呼び出す場合は、静的メソッドを使用する必要があります。静的メソッドは、クラスが読み込まれるときにすでに読み込まれており、クラス名を使用して直接呼び出すことができます。プログラムエントリーです。 2 つの違いは、静的コード ブロックは自動的に実行されるのに対し、静的メソッドは呼び出されたときに実行されることです。
2. 静的メソッドの注意事項
クラスの静的メソッドを使用する場合、次の点に注意してください。
a. 静的メソッドでは、同じクラスの他の静的メンバー (変数やメソッドを含む) のみを直接呼び出すことができます。の非静的メンバーに直接アクセスすることはできません。これは、非静的メソッドと変数は使用する前にクラスのインスタンス オブジェクトを作成する必要があるのに対し、静的メソッドは使用する前にオブジェクトを作成する必要がないためです。
b. 静的メソッドは、使用前にインスタンス オブジェクトを作成する必要がないため、いかなる方法でも this キーワードと super キーワードを参照できません。静的メソッドが呼び出されるとき、this によって参照されるオブジェクトはまったく生成されません。このキーワードはメソッド内でのみ使用でき、「メソッドを呼び出す
オブジェクト」への参照を表します。
静的変数とは、オブジェクトではなくクラス全体に属する変数です。メソッド本体内の変数は、たとえば次のように静的に宣言できないことに注意してください。 fun() { static int i=0;//不正です。 }
3. プログラム例
public class TestStaticCon { public static int a = 0; static { a = 10; System.out.println("父类的静态代码块在执行a=" + a); } { a = 8; System.out.println("父类的非静态代码块在执行a=" + a); } public TestStaticCon() { this("a在父类带参构造方法中的值:" + TestStaticCon.a); // 调用另外一个构造方法 System.out.println(a); System.out.println("父类无参构造方法在执行a=" + a); } public TestStaticCon(String n) { System.out.println(n); System.out.println(a); } public static void main(String[] args) { TestStaticCon tsc = null; System.out.println("!!!!!!!!!!!!!!!!!!!!!"); tsc = new TestStaticCon(); } }
运行结果: 父类的静态代码块在执行a=10 !!!!!!!!!!!!!!!!!!!!! 父类的非静态代码块在执行a=8 a在父类带参构造方法中的值:10 8 8 父类无参构造方法在执行a=8
4. ネット民提供
public class StaticBlock { static { System.out.println("静态块"); } { System.out.println("构造块,在类中定义"); } public StaticBlock() { System.out.println("构造方法执行"); } public static void main(String[] args) { new StaticBlock(); new StaticBlock(); } }
静态块 构造块,在类中定义 构造方法执行 构造块,在类中定义 构造方法执行
結論: 静的コード ブロックはクラスがロードされるときに自動的に実行され、非静的コード ブロックはオブジェクトの作成時に自動的に実行されるコードです。オブジェクトが作成されない場合、このクラスの非静的コード ブロックは実行されません。そして、実行順序は、静的コード ブロック ------非静的コード ブロック -コンストラクターです。
私を困惑させたのは、「パラメーターが 10 である親クラスのコンストラクター メソッドの a の値」です。次に、なぜその時点で 8 ではなかったのかを考えました (F11、ブレークポイントを直接設定して実行することはできません)。これは直接実行するのと同じです。違いはありません)、最初にパラメーターなしのコンストラクターに入り、最初のステートメントを実行して、別のコンストラクターに切り替えたことがわかりました (最初の文は、そうであるかどうかに関係なく実行する必要があります。この時点では、a はまだ 10 です) 、非静的コード ブロックはまだ実行されていません)、このステートメントがこの警告を表示するかどうかに関係なく、ソースが見つからないことを示します (プログラムは正常に実行を続けるためエラーではありません)。その後、非静的コード ブロックを実行します。静的コード ブロックを作成し、パラメーターを指定してコンストラクターから続行します 実行...
Java での静的静的コード ブロックの使用に関する詳細な説明については、PHP 中国語 Web サイトに注目してください。