Java 入門

ホーム > Java の基本 > 既定値での初期化、コンストラクタ - 変数の初期化 (1/3)

既定値での初期化、コンストラクタ - 変数の初期化 (1/3)

既定値での初期化

変数を次のように宣言したとします。

class MyClass1 {
     int i;
     boolean b;
     ...
}

例えば C 言語などでは変数の既定の値が定められていないので、こうして宣言されただけではその変数に設定されている値はわかりません。 同じコードでも環境やビルド方法によって動作が変わってくるので、よくゴミが入っているというような言い方をします。

しかし、Java では変数の初期値が決められているので、上のように int 型、boolean 型の値を宣言したら、 その値はそれぞれ、0、false になります。

これが最も基本的な初期化です。

初期値はデータ型によって違います。詳しくは変数に関する説明 をみてください。

コンストラクタでの初期化

クラスを定義する際、そのクラスのオブジェクトが作られるときに呼び出される、特別な初期化メソッドを定義することができます。

これをコンストラクタといいます。

コンストラクタはクラス名と同じ名前のメソッドとして、戻り値はありません。

public class Constructor1 {

     public static void main(String[] args) {
          Animal a = new Animal(10);
          a.showAge();          
     }

}

class Animal {

     int age;
          
     public Animal( int age ) {
          this.age = age;
     }
     
     public void showAge(){
          System.out.format( "Age: %d\n", age );
     }

}

実行例は次のとおりです。

Age: 10

コンストラクタ内から他のコンストラクタを呼出す

同じクラス内のコンストラクタを呼出す

コンストラクタはパラメータ違いで複数定義することが可能です。 あるコンストラクタから同じクラス内のもうひとつのコンストラクタを呼出す場合は、this を用います。

次の例を見てください。

class Dog extends Animal {

     String name;
     
     public Dog( int age ) {
          this( age, "Pochi" );
     }
     
     public Dog( int age, String name ) {
          ...
     }

     ...     
}

ここではコンストラクタが二つ定義されています。ひとつは Dog( int age ) で、 もうひとつは Dog( int age, String name ) です。

前者のコンストラクタを利用した場合は、名前を "Pochi" に設定してもうひとつのコンストラクタを呼出しています。

スーパークラスのコンストラクタを呼出す

派生クラスの初期化時にスーパークラスを初期化する必要がある場合は、スーパークラスのコンストラクタを呼出す必要があります。 スーパークラスがカプセル化されていれば、派生クラスからその private フィールドへアクセスできないので、コンストラクタを経由してそれを初期化しなければならないからです。

スーパークラスのコンストラクタは、super を用いて呼出します。具体例は次の例を見てください。

具体例

具体例は次のとおりです。

ここでは簡単なクラス、Animal と Dog を定義します。コンストラクタ内の super や this に着目してください。

クラス図

public class Constructor1 {

     public static void main(String[] args) {

          // Animal
          Animal a = new Animal(10);
          
          a.showAge();
          
          // Dog
          Dog d = new Dog( 3 );
          
          d.showAge();
          d.showName();
          
     }

}


class Animal {

     int age;
          
     public Animal( int age ) {
          this.age = age;
     }
     
     public void showAge(){
          System.out.format( "Age: %d\n", age );
     }

}


class Dog extends Animal {

     String name;
     
     public Dog( int age ) {
          this( age, "Pochi" );
     }
     
     public Dog( int age, String name ) {
          super( age );
          this.name = name;
     }
     
     public void showName(){
          System.out.format( "Name: %s\n", name );
     }

}

実行例は次のとおりです。

Age: 10
Age: 3
Name: Pochi

super を経由してスーパークラスの変数 age を正しく初期化できています。

コンストラクタについては以上です。

さて、それでは次のトピックです。 コンストラクタは C++ などをご存知の方はなじみがあったと思いますが、 次の方法は Java らしい方法です。

それは、 初期化ブロックです。

» 初期化ブロック

ホーム > Java の基本 > 既定値での初期化、コンストラクタ - 変数の初期化 (1/3)