“コンストラクタ”と初期化、本当に理解できてる?【改訂版】Eclipseではじめるプログラミング(13)(1/3 ページ)

これからプログラミングを学習したい方、Javaは難しそうでとっつきづらいという方のためのJavaプログラミング超入門連載です。最新のEclipse 3.4とJava 6を使い大幅に情報量を増やした、連載「Eclipseではじめるプログラミング」の改訂版となります

» 2009年12月17日 00時00分 公開
[小山博史株式会社ガリレオ]

コンストラクタでケアレスミスを少なくしよう

 Javaでは、正しい状態のオブジェクトを生成するために、「コンストラクタ(construtor、組立てる者)」というものが用意されています。クラスの各フィールドの初期化処理を実行するコンストラクタを用意することにより、「プログラマが、初期化がされていないオブジェクトをケアレスミスで用意してしまう」ことを防いでいるのです。

 前回の「継承やオーバーライドで簡単にクラスを“拡張”しよう」で、今回は「アクセス制限」についても説明するといいましたが、その前に、コンストラクタや、これまでにも出てきた「this」キーワード、そして「インスタンス初期化」「シャドウ」について解説しておきます。

 EclipseでJavaプログラミングを始める準備がまだの方は、連載第1回の「Eclipse 3.4で超簡単Javaプログラミング基礎入門」で準備をしておいてください。

インスタンス初期化に必須の「コンストラクタ」とは

 これまでの連載では、クラスの「コンストラクタ」について詳しく説明していませんでしたが、クラスのインスタンス初期化を理解するには、これを理解しておく必要があります。

 前回解説した「クラス拡張」を使う場合には、スーパークラスのコンストラクタがどのように呼ばれることになっているのか、どう利用するべきなのか、といったことをきちんと理解しておく必要があります。

 クラスのインスタンス初期化をするためには、インスタンス変数に対して明示的に指定された初期化子と初期化ブロックを使う必要があることを説明しましたが、インスタンス生成時に引数を渡して、その値で初期化するような複雑な初期化をしたい場合もあると思います。

コンストラクタの構文

 そんなときはコンストラクタを使います。これは、次のようにクラスと同じ名前で、メソッドと同じように引数を取れます。引数は空でも構いません。メソッドと似ていますが、インスタンスを生成する際に使用する処理を記述するものなので、戻り型の指定はありません。

クラス名(仮パラメータ型 仮パラメータ名) { 初期化処理 }
コンストラクタの宣言方法

初期化の順序

 クラスのインスタンスは生成されると、次の順番に初期化されます。「スーパークラスのコンストラクタを呼び出す」方法は後で説明しますから、ここでは順番に注目してください。

  1. インスタンス変数は、デフォルトの値で初期化(数値型は0、boolean型はfalse、char型は'\u0000'、オブジェクト参照はnull)
  2. スーパークラスのコンストラクタを呼び出す
  3. インスタンス変数に対して明示的に指定された初期化子と、初期化ブロックで、初期化
  4. コンストラクタで指定された処理で初期化

インスタンス初期化をEclipseでやってみよう

 まずは、次のシンプルなsample13.ConstructorTestBaseクラスを作ってみましょう。

package sample13;
class ConstructorTestBase {
 
}
ConstructorTestBase.java

「引数なしのコンストラクタ」が暗黙のうちに用意

 前回説明したとおり、Javaのクラスはすべて、暗黙のうちにjava.lang.Objectクラスを拡張しています。コンストラクタは定義されていませんが、この場合は「引数なしのコンストラクタ」が暗黙のうちに用意されます。これは、ほかにコンストラクタが定義されていない場合にのみ用意されます。

Eclipseはコンストラクタも自動作成も自動作成

 ここで、コンストラクタを作成する際に便利なEclipseの機能を紹介しておきましょう。クラスのソース内にカーソルをおいて、[Ctrl]+[SPACE]キーを押下します。すると、コンストラクタが候補に挙がります。一覧内で緑丸の右上に「C」が付いているものがコンストラクタです。

 例えば、図1は、sample13.ConstructorTestBaseクラスへ明示的に引数なしのコンストラクタを指定するところをキャプチャしたものです。

図1 Eclipseでコンストラクタを自動作成 図1 Eclipseでコンストラクタを自動作成

引数を取るコンストラクタ

 次に例示するsample13.ConstructorTestBase1クラスの場合は、int型の引数を取るコンストラクタが定義されているので、引数なしのコンストラクタは用意されません。

package sample13;
class ConstructorTestBase1 {
    int n;
    ConstructorTestBase1(int n) {
        super();
        this.n = n;
        System.out.println("ConstructorTestBase1:" + n);
    }
}
ConstructorTestBase1.java

 実はEclipseでは、フィールドを初期化するコンストラクタを簡単に生成できます。

  1. フィールドを定義した後に、クラスのソース内にマウスカーソルをおいて右ボタンをクリックしてメニューを表示
  2. [ソース]→[フィールドを使用してコンストラクターを生成]を指定(図2)
  3. [フィールドを使用してコンストラクターを生成]ダイアログが表示されるので、適切な値を指定(今回の例では、デフォルトのまま)
  4. [OK]をクリック
図2 [フィールドを使用してコンストラクターを生成] 図2 [フィールドを使用してコンストラクターを生成]

 このようにEclipseの機能を使うと、できあがったコンストラクタへ必要な処理(ここでは、「System.out.println("ConstructorTestBase1:" + n);」)を追加するだけで済みます。ここで、「super()」という行がありますが、これについては後で説明をするので、ここでは取りあえずはおまじないだと思っておいてください。

 次ページからは、thisキーワードやシャドウ、this呼び出し、そしてスーパークラスのコンストラクタについて解説します。

       1|2|3 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。