まず、JVM メモリ モデルについて説明します。
JVM メモリは、メソッド領域、ヒープ、スタック、プログラム カウンターに分割されます。
メソッド領域、スタック、ヒープについて簡単に説明します:
メソッド領域: 各スレッドによって共有される領域であり、クラス情報/定数/静的変数を格納します。
Stack: 実際には、各スレッドにはスタックが割り当てられ、そのライフサイクルはスレッドのライフサイクルと同じです。メソッドを実行すると、スタック フレームが生成されます。スタック フレームにはメソッド内のローカル変数が含まれます。
ヒープ: すべてのクラスのインスタンス化はヒープに保存されます。
(ビデオ チュートリアルの推奨: java ビデオ チュートリアル)
1. メモリの観点から静的と非静的の違いを分析する
静的は、メンバ変数とメンバメソッドを変更します。その値が格納されるアドレスは、メソッド領域の定数プールです。実行順序は、静的に変更された変数名またはメソッドを定数プールに格納するときに実行されます。クラスをロードしています。
静的に変更されない変数は、メンバー変数とローカル変数にすることができます。
メンバー変数は、オブジェクトがクラスの一部であり、そのアドレスがヒープ内にあるため、オブジェクトが格納されているアドレスと同じです。
ローカル変数は通常、メソッド内で宣言され、その格納アドレスはスタック上にあります。
2. 実行メカニズムからの分析
ソース コードがコンパイラーによって .class バイトコード ファイルにコンパイルされるとき、クラスがロードされると、クラスは変更されます。 with static ブロック/変数/メソッドはすぐにメソッド領域に格納されます。同時に、非静的ブロック/変数/メソッドはまだコンパイルされていません。非静的変数が静的メソッドに格納されると、プログラム カウンタはローカル変数を示しますが、この時点ではローカル変数がコンパイルされていないため、エラーが報告されます。
推奨チュートリアル: java エントリー プログラム
以上がJavaの静的と非静的の違いは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。