「メソッドとデータ メンバー」で、Java のオブジェクトは作成時に初期化されると述べました。初期化中に、オブジェクトのデータ メンバーに初期値が割り当てられます。明示的に初期化できます。データ メンバーに初期値を割り当てない場合、データ メンバーはその型に基づいてデフォルトの初期値を採用します。
明示的な初期化では、プログラムを作成するときに初期値を決定する必要がありますが、これは不便な場合があります。コンストラクターを使用してオブジェクトを初期化できます。コンストラクターはデータ メンバーを初期化し、特定の操作を指定できます。これらの操作は、オブジェクトの作成時に自動的に実行されます。
コンストラクターを定義する
コンストラクターはメソッドです。通常のメソッドと同様に、クラス内にコンストラクターを定義します。コンストラクターには次の基本的な特性があります。
1. コンストラクターの名前はクラスの名前と同じです。
2. コンストラクタには戻り値がありません
Human クラスのコンストラクターを定義します。
public class Test{ public static void main(String[] args) { Human aperson = new Human(160); System.out.println(aperson.getHeight()) }}class Human{ /** * コンストラクター */ Human (int h) { this.height = h; System.out.println("生まれました"); /** * アクセサ */ int getHeight() { return this.height; } int の高さ;}
上記のプログラムは、コピーされたコードを次のように出力します。
私は生まれました
160
コンストラクターは、通常のメソッドと同様にパラメーター リストを受け取ることができます。ここで、コンストラクター Human() はパラメーターとして整数を受け取ります。メソッドの本体では、整数パラメーターをデータ メンバーの高さに割り当てます。コンストラクターは、オブジェクトの作成時に次の 2 つのことを行います。
コンストラクターは、通常のメソッドと同様にパラメーター リストを受け取ることができます。ここで、コンストラクター Human() はパラメーターとして整数を受け取ります。メソッドの本体では、整数パラメーターをデータ メンバーの高さに割り当てます。コンストラクターは、オブジェクトの作成時に次の 2 つのことを行います。
1. データメンバー this.height = h に初期値を指定します。
2. 特定の初期操作を実行します。 System.out.println("I'm Born");
このようにして、明示的な初期化ほど制約を受けることなく、コンストラクターを呼び出すときに初期値を柔軟に設定できます。
コンストラクターはどのように呼び出されますか?クラスを作成するときは、全員 new Human() を使用します。実際、Human クラスのコンストラクターを呼び出しています。このメソッドを定義しない場合、Java は new を使用するときに呼び出される空のコンストラクターを提供します。ただし、コンストラクターを定義すると、Java はオブジェクトの作成時に定義されたコンストラクターを呼び出します。呼び出し時には、パラメータ 160 を指定します。また、最終的な実行結果から、オブジェクトの高さが実際に 160 に初期化されていることもわかります。
初期化方法の優先順位
メソッドとデータ メンバーで、明示的な初期値を指定すると、データ メンバーはデフォルトの初期値の代わりに明示的な初期値を取得することがわかります。ただし、明示的な初期値を指定し、コンストラクターで同じデータ メンバーを初期化する場合、最終的な初期値はコンストラクターによって決定されます。たとえば、次の例:
public class Test{ public static void main(String[] args) { Human aperson = new Human(160); System.out.println(aperson.getHeight()) }}class Human{ /** * コンストラクター */ Human (int h) { this.height = h; } /** * アクセサ */ int getHeight() { return this.height=170; // 明示的な初期化}
実行結果は次のとおりです。
次のようにコードをコピーします。
160
オブジェクトの最終的な初期化値は、構築メソッドの値と一致します。したがって:
ビルドメソッド > 明示的なイニシャライザ > デフォルトのイニシャライザ
(実際には、いわゆる優先度は初期化時の実行順序に関係します。この点については後ほど詳しく説明します)
メソッドのオーバーロード
クラスは複数のコンストラクターを定義できます。次に例を示します。
public class Test{ public static void main(String[] args) { Human neZha = new Human(150, "shit"); System.out.println(neZha.getHeight()); }}class Human{ /** *コンストラクター 1 */ Human(int h) { this.height = h; System.out.println("I'm Born") } /** * コンストラクター 2 */ Human(int h, String) s) { this.height = h; System.out.println("Ne Zha: 私は生まれました、 " + s); } /** * accessor */ int getHeight() { return this.height; ;}
実行結果:
次のようにコードをコピーします。
ネ・ザ: 生まれたんだよ、クソ
150
上記では 2 つのコンストラクターが定義されており、どちらも Human という名前です。 2 つのコンストラクターには異なるパラメーター リストがあります。
new を使用してオブジェクトを作成する場合、Java は提供されたパラメーターに基づいてどのコンストラクターを構築するかを決定します。たとえば、neZha をビルドする場合、整数 150 と文字列「shit」の 2 つのパラメータを指定します。これは 2 番目のビルド メソッドのパラメータ リストに対応するため、Java は 2 番目のビルド メソッドを呼び出します。
Java では、Java はメソッド名とパラメータ リストの両方に基づいて呼び出されるメソッドを決定します。これはメソッドのオーバーロードと呼ばれます。ビルド メソッドはオーバーロードできます。また、以下の Breath() メソッドなどの通常のメソッドもオーバーロードできます。
public class Test{ public static void main(String[] args) { Human aperson = new Human(); aperson.breath(10) }}class Human{ /** * Breath() 1 */ void Breath(); System.out.println("hu...hu..."); } /** * Breath() 2 */ void Breath(int rep) { int i; for(i = 0; i < rep; i++ ) { System.out.println("lu...lu...") } } int height;}
実行結果:
次のようにコードをコピーします。
ルル…ル…
ルル…ル…
ルル…ル…
ルル…ル…
ルル…ル…
ルル…ル…
ルル…ル…
ルル…ル…
ルル…ル…
ルル…ル…
ご覧のとおり、呼び出し中にパラメーター (整数 10) が指定されるため、パラメーター リストがそれに一致する 2 番目の Breath() メソッドが呼び出されます。
要約する
コンストラクターの特性: クラスと同じ名前、戻り値なし
コンストラクターの目的: 初期化、初期操作メソッドのオーバーロード: メソッド名 + パラメーターのリスト -> 実際に呼び出されるメソッド