Developer

【はじめてのJava】staticイニシャライザ (書き方)【オブジェクトとクラス編】
2021.09.30
Lv1

【はじめてのJava】staticイニシャライザ (書き方)【オブジェクトとクラス編】

はじめてのJava

このシリーズでは、初めてJavaやプログラミングを勉強する方向けに、Javaによるプログラミングの基礎を説明していきます。
目標レベルは、Javaの資格試験の一つである「Oracle Certified Java Programmer, Silver」(通称Java Silver)に合格できる程度の知識の習得です。
はじめてJavaやプログラムに触れる方にもできるだけわかりやすい解説を心がけていきます。


オブジェクトとクラス編

オブジェクトとクラス編では、Javaを扱う上で非常によく出てくる「オブジェクト」や「クラス」について扱っていきます。

以前の記事では「staticイニシャライザ」について扱いました。

今回も引き続き「staticイニシャライザ」について扱います。


目次


staticイニシャライザ

 

 staticイニシャライザ とはクラスが読み込まれた際に実行する処理を定義する箇所です。

staticイニシャライザには主にstatic変数の初期値を記載します。

前回の説明ではSmartPhoneクラスを使ってstaticイニシャライザの必要性を説明しました。

今回はstaticイニシャライザの具体的な書き方を見ていきます。

引き続きスマートフォンを表すSmartPhoneクラスで説明していきます。SmartPhoneクラスには、電話番号を表すインスタンス変数phoneNumberと通信の残り容量を表すStatic変数capacityがあります。

通信の残り容量であるcapacityは、全インスタンスで共通であるものとして、static変数とします。

phoneNumberはインスタンス変数ですので、コンストラクタで初期化するものとします。

以上をソースコードにすると以下の通りです。

class SmartPhone{
  String phoneNumber; //電話番号
  static double capacity; //データ通信の容量

  SmartPhone(String phoneNumber){
    this.phoneNumber = phoneNumber;
  }
}

今回はstatic変数であるcapacityを初期化するためにstaticイニシャライザを書き足していきます。

なお、前回説明した通り、static変数は、イニシャライザやコンストラクタで初期化してしまうと意図しない動作につながる可能性があります。(詳しくは前回の記事を参照。)


staticイニシャライザの書き方

staticイニシャライザは、イニシャライザ同様に クラスの直下に記載し、staticという修飾子を付けます 

書き方は以下の通りです。

class クラス名{

  //staticイニシャライザ
  static{
    //ここにstaticイニシャライザの処理内容を書く
  }

}

前述のSmartPhoneクラスであれば、以下のようになります。

SmartPhoneクラス(static変数とstaticイニシャライザ部分を抜粋)

class SmartPhone{

  static double capacity; //データ通信の容量

  //staticイニシャライザ
  static{
    capacity = 30.0;
  }

}

SmartPhoneクラス(全体)

class SmartPhone{

  String phoneNumber; //電話番号
  static double capacity; //データ通信の容量

  //staticイニシャライザ
  static{
    capacity = 30.0;
  }
 
  SmartPhone(String phoneNumber){
    this.phoneNumber = phoneNumber;
  }
}

staticイニシャライザを利用することで、最初の1台のインスタンス化よりも前にcapacityが30.0で設定されます。下の図のように何度インスタンス化をしてもcapacityが再設定されることはありません。

確認用コードは以下の通りです。コメント部分以外変更点はありません。

public class CheckPhone{
  public static void main(String[] args){
    //1台目
    SmartPhone sp1 = new SmartPhone("090-XXXX-XXXX"); //インスタンス化
    //↓sp1の容量を確認。
    System.out.println(sp1.phoneNumber + " : " + sp1.capacity); //通信容量は30.0

    sp1.capacity -= 5.0; //通信容量を5だけ使ったと想定
    System.out.println(sp1.phoneNumber + " : " + sp1.capacity); //通信容量は25.0

    //2台目
    SmartPhone sp2 = new SmartPhone("080-YYYY-YYYY"); //インスタンス化
    //↓sp2の容量を確認。
    System.out.println(sp2.phoneNumber + " : " + sp2.capacity); //通信容量は25.0のまま

    //↓sp1の容量を再確認
    System.out.println(sp1.phoneNumber + " : " + sp1.capacity); //通信容量は25.0のまま
  }
}

ソースコード

今回使用したソースコードをまとめて記載します。2つのソースコードは同じディレクトリに配置する必要があります。

SmartPhone.java

class SmartPhone{

  String phoneNumber; //電話番号
  static double capacity; //データ通信の容量

  //staticイニシャライザ
  static{
    capacity = 30.0;
  }
 
  SmartPhone(String phoneNumber){
    this.phoneNumber = phoneNumber;
  }
}

動作確認用クラス(CheckPhone.java)

public class CheckPhone{
  public static void main(String[] args){
    //1台目
    SmartPhone sp1 = new SmartPhone("090-XXXX-XXXX"); //インスタンス化
    //↓sp1の容量を確認。
    System.out.println(sp1.phoneNumber + " : " + sp1.capacity); //通信容量は30.0

    sp1.capacity -= 5.0; //通信容量を5だけ使ったと想定
    System.out.println(sp1.phoneNumber + " : " + sp1.capacity); //通信容量は25.0

    //2台目
    SmartPhone sp2 = new SmartPhone("080-YYYY-YYYY"); //インスタンス化
    //↓sp2の容量を確認。
    System.out.println(sp2.phoneNumber + " : " + sp2.capacity); //通信容量は25.0のまま

    //↓sp1の容量を再確認
    System.out.println(sp1.phoneNumber + " : " + sp1.capacity); //通信容量は25.0のまま
  }
}

実行の様子は以下の通りです。


まとめ

staticイニシャライザはクラスの直下に記述する
staticイニシャライザはインスタンス化よりも前のタイミングで動作する


次回

次回も引き続きクラスやオブジェクトに関する内容を扱います。


はじめてのJavaシリーズの目次はこちら
オブジェクトとクラス編はこちら


java 11 の練習問題一覧はこちら
はじめてのJavaシリーズの練習問題一覧はこちら