ご存知のように、クラスはオブジェクトの青写真を提供します。クラスからオブジェクトを作成します。 CreateObjectDemo
プログラムから取得した次の各ステートメントは、オブジェクトを作成し、それを変数に割り当てます。
最初の行は、Point
クラスであり、2行目と3行目はそれぞれRectangle
クラスのオブジェクトを作成します。
これらの各ステートメントには3つの部分があります。 (以下で詳細に説明します):
- 宣言:太字で設定されたコードはすべて、変数名をオブジェクトタイプに関連付ける変数宣言です。
- インスタンス化:新しいキーワードはオブジェクトを作成するJava演算子です。
- 初期化:新しい演算子の後にコンストラクターが呼び出され、新しいオブジェクトが初期化されます。
変数の宣言オブジェクトを参照するには
以前、変数を宣言するには、次のように記述していることを学びました。
type name;
これは、typeがtypeであるデータを参照するためにnameを使用することをコンパイラーに通知します。プリミティブ変数の場合、この宣言は変数用に適切な量のメモリを予約します。
参照変数を独自の行で宣言することもできます。例:
Point originOne;
このようにoriginOne
を宣言すると、その値は次のようになります。オブジェクトが実際に作成されて割り当てられるまでは未定です。参照変数を宣言するだけでは、オブジェクトは作成されません。そのためには、次のセクションで説明するように、new
演算子を使用する必要があります。コードで使用する前に、オブジェクトをoriginOne
に割り当てる必要があります。そうしないと、コンパイラエラーが発生します。
現在オブジェクトを参照していないこの状態の変数は、次のように説明できます(変数名、originOne
、および何も指していない参照):
クラスのインスタンス化
new演算子は、新しいオブジェクトにメモリを割り当て、そのメモリへの参照を返すことにより、クラスをインスタンス化します。 new演算子は、オブジェクトコンストラクタも呼び出します。
新しい演算子には、コンストラクターの呼び出しという1つの後置引数が必要です。コンストラクターの名前は、インスタンス化するクラスの名前を提供します。
new演算子は、作成したオブジェクトへの参照を返します。この参照は通常、次のような適切なタイプの変数に割り当てられます。
新しい演算子によって返される参照は、変数に割り当てる必要があります。式で直接使用することもできます。例:
int height = new Rectangle().height;
このステートメントについては、次のセクションで説明します。
オブジェクトの初期化
Pointクラスのコードは次のとおりです。
public class Point { public int x = 0; public int y = 0; //constructor public Point(int a, int b) { x = a; y = b; }}
このクラスには単一のコンストラクタが含まれています。その宣言はクラスと同じ名前を使用し、戻り型がないため、コンストラクタを認識できます。Pointクラスのコンストラクタは、コード(int)で宣言されているように2つの整数引数を取ります。 a、int b)次のステートメントは、これらの引数の値として23と94を提供します。
Point originOne = new Point(23, 94);
これを実行した結果ステートメントは次の図に示されています:
ここに4つのコンストラクターを含むRectangleクラスのコードがあります。
各コンストラクターでは、プリミティブ型と参照型の両方を使用して、長方形の原点、幅、高さの初期値を指定できます。クラスに複数のコンストラクターがある場合、それらは異なるシグネチャを持つ必要があります。Javaコンパイラーはtを区別します。引数の数とタイプに基づいてコンストラクターを作成します。 Javaコンパイラが次のコードを検出すると、Point引数とそれに続く2つの整数引数を必要とするRectangleクラスのコンストラクタを呼び出すことがわかります。
Rectangle rectOne = new Rectangle(originOne, 100, 200);
これは、origin
をoriginOne
に初期化するRectangle
のコンストラクターの1つを呼び出します。 div>。また、コンストラクターはwidth
を100に設定し、height
を200に設定します。これで、同じPointオブジェクトへの2つの参照があります。次の図に示すように、オブジェクトは複数の参照を持つことができます。
次のコード行は、2つの整数引数を必要とするRectangle
コンストラクターを呼び出します。幅と高さの値。コンストラクター内のコードを調べると、x値とy値が0に初期化された新しいPointオブジェクトが作成されていることがわかります。
Rectangle rectTwo = new Rectangle(50, 100);
次のステートメントで使用されているRectangleコンストラクターは引数をとらないため、引数なしのコンストラクターと呼ばれます。
Rectangle rect = new Rectangle();
すべてのクラスには少なくとも1つのコンストラクターがあります。クラスが明示的に宣言していない場合、Javaコンパイラはデフォルトコンストラクタと呼ばれる引数のないコンストラクタを自動的に提供します。このデフォルトのコンストラクターは、クラスの親の引数なしコンストラクターを呼び出します。クラスに他の親がない場合はObject
コンストラクターを呼び出します。親にコンストラクターがない場合(Object
には1つあります)、コンパイラはプログラムを拒否します。