この記事では、主に Java のコンストラクターの初期化を例を通して分析します。コードは非常にシンプルで、必要な方は理解できるでしょう。
1. 初期化シーケンス
Java がオブジェクトを作成すると、システムはまずオブジェクトのすべてのインスタンス属性にメモリを割り当てます (クラスがロードされている場合)。その後、プログラムがこれらのインスタンス属性の初期化を開始し、初期化シーケンスが開始されます。 Yes: 初期化ブロックまたは属性宣言時に指定した初期値を実行してから、コンストラクタで指定した初期値を実行します。 クラス内では、変数定義の順序によって初期化の順序が決まります。変数がメソッド定義間に分散している場合でも、メソッド (コンストラクターを含む) が呼び出される前に初期化されます。
class Window { Window(int maker) { System.out.println("Window(" + maker + ")"); } } class House { Window window1 = new Window(1); House() { System.out.println("House()"); w3 = new Window(33); } Window window2 = new Window(2); void f() { System.out.println("f()"); } Window w3 = new Window(3); } public class OrderOfInitialization { public static void main(String[] args) { House h = new House(); h.f(); } }
実行結果:
Window(1) Window(2) Window(3) House() Window(33) f()
出力からわかるように、参照 w3 は 2 回初期化されます。1 回はコンストラクターを呼び出す前に、もう 1 回は呼び出し中に (初めて参照されるオブジェクト)廃棄し、ゴミとして回収させていただきます。)
2. 静的データの初期化
オブジェクトがいくつ作成されても、静的データは 1 つの記憶領域のみを占有します。 static キーワードはローカル変数には適用できないため、ドメインにのみ適用できます。
class Bowl { Bowl(int maker) { System.out.println("Bowl(" + maker + ")"); } void f1(int maker) { System.out.println("f1(" + maker + ")"); } } class Table { static Bowl bowl1 = new Bowl(1); Table() { System.out.println("Table()"); bowl2.f1(1); } void f2(int maker) { System.out.println("f2(" + maker + ")"); } static Bowl bowl2 = new Bowl(2); } class Cupboard { Bowl bowl3 = new Bowl(3); static Bowl bowl4 = new Bowl(4); Cupboard() { System.out.println("CupBoard()"); bowl4.f1(2); } void f3(int maker) { System.out.println("f3(" + maker + ")"); } static Bowl bowl5 = new Bowl(5); } public class StaticInitialization { public static void main(String[] args) { System.out.println("created new Cupboard() in main"); new Cupboard(); System.out.println("created new Cupboard in main"); new Cupboard(); table.f2(1); cupboard.f3(1); } static Table table = new Table(); static Cupboard cupboard = new Cupboard(); }
実行結果:
Bowl(1) Bowl(2) Table() f1(1) Bowl(4) Bowl(5) Bowl(3) CupBoard() f1(2) created new Cupboard() in main Bowl(3) CupBoard() f1(2) created new Cupboard in main Bowl(3) CupBoard() f1(2) f2(1) f3(1)
ある程度、初期化は固定の実行コードであり、パラメータを受け入れることができません。したがって、同じクラスのすべてのオブジェクトに対して初期化ブロックによって実行される初期化プロセスはまったく同じです。このため、すべてのオブジェクトに対してまったく同じで、パラメーターを受け入れる必要のない初期化処理コードが存在する場合、初期化ブロックの基本的な使用法を見つけるのは難しくありません。初期化ブロックに抽出できます。
以上がJava でのコンストラクター初期化の共有例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。