HOWTO · Java

Java でのインスタンス化の意味

この記事では、Java でのインスタンス化のトピックについて説明します。

このページの内容

Javaでクラスをインスタンス化するとは、そのクラスのオブジェクトを作成することです。newでオブジェクトを作成すると参照が返され、その参照を変数に代入して利用できます。

Javaでクラスをインスタンス化するとは?

Javaでクラスをインスタンス化するとは、そのクラスのインスタンスであるオブジェクトを作成することです。クラスは、オブジェクトが持てるフィールドやメソッドを定義します。オブジェクトは、独自のフィールド値を持つ個々のインスタンスです。たとえば car のような変数にはオブジェクトへの参照が格納され、その参照を使ってフィールドやメソッドにアクセスできます。

newによるオブジェクトの生成とコンストラクターによる初期化

次の例では、Carオブジェクトを作成してその参照をcarに格納し、オブジェクトのメソッドを呼び出します。

public class Car {
    private final String model;
    private final String color;

    Car(String model, String color) {
        this.model = model;
        this.color = color;
    }

    void display() {
        System.out.println("Car model: " + model + ", Color: " + color);
    }

    public static void main(String[] args) {
        Car car = new Car("Toyota", "Red");
        car.display();
    }
}

new Car("Toyota", "Red")という式はCarのインスタンスを作成し、2つの引数を渡してコンストラクターを呼び出します。この式は参照を生成し、代入によってその参照がcarに格納されます。コンストラクターの名前はクラス名と同じで、戻り値の型はありません。引数を使って、新しいオブジェクトのフィールドを設定できます。このプログラムでは、参照を通じてモデル名と色を表示します。

クラスにコンストラクターを明示的に記述する必要があるとは限りません。クラスが独自のコンストラクターを1つも宣言していない場合に限り、Javaは引数なしのデフォルトコンストラクターを用意します。引数を取るコンストラクターを宣言すると、Javaはそのデフォルトコンストラクターを追加しません。

抽象クラスは、サブクラスで実装するメソッドを残している場合があるため、直接インスタンス化できません。必要な実装を提供する具象サブクラスなら、インスタンス化できます。

オブジェクトが状態を保持し、インスタンスメソッドを使う仕組み

各オブジェクトは、それぞれ独自のインスタンスフィールドの値を持ちます。たとえば、2つのCarオブジェクトは、どちらもCarクラスで定義された同じdisplay()メソッドを使いながら、異なるモデル名や色を保持できます。インスタンスメソッドは、呼び出し時に参照されている特定のオブジェクトに対して動作します。car.display()では、そのcarのフィールドを読み取ります。別のオブジェクトを作成すると、最初のオブジェクトの値が変わるのではなく、別個のインスタンス状態ができます。

Javaにおけるインスタンス化と初期化の違い

インスタンス化はオブジェクトを作成すること、初期化はオブジェクトの初期状態を設定することです。この2つは関連する手順ですが、同じ意味ではありません。Javaでは、オブジェクトの作成時にインスタンスフィールドがデフォルト値で初期化され、その後、フィールド初期化子やコンストラクターによって、より適切な値を設定できます。後から代入してオブジェクトの状態を変更することもできます。

例のnew Car(...)はインスタンス化を行う式で、Carコンストラクターはmodelとcolorの初期値を設定します。コンストラクターはオブジェクトを初期化する方法の1つですが、「インスタンス化」と「初期化」を同じ意味にするものではありません。