Thinkers'Studio
JavaとC言語の自習ツール
Javaにおける変数の初期化についての整理

 メソッドで宣言したローカル変数やクラスのメンバ変数を初期化せずに使うと ・・・ ?
 今回の Tips では、そのような変数の初期化に関することを少し整理したいと思います。

クラスのメンバ変数

 static をつけるかどうかで意味合い(呼び方)が違いますので、下記に区別を示します。初期値の扱いは同じです。

 インスタンス変数 (static をつけずに宣言)
  インスタンスごとに異なる属性値を持つための変数。一般に使うメンバ変数はこちらです。

 クラス変数 (static をつけて宣言)
  クラスのすべてのインスタンスから共有する変数。java.Math クラスの PI などがそうです。 「静的変数」ということもあります。

 初期化の扱い
  明示的に初期化しないと、既定の値が初期値として入ります。
  ==> 数値の型には 0、boolean型には false、オブジェクト参照の変数には null が入る
  ==> 配列は、宣言だけした場合(下記例の eye)は配列変数に null が入る
     new で場所を用意した場合(下記例の prs)は、各要素にその型の既定の初期値が入る()

 【 いろいろなメンバ変数宣言 】
  明示的に初期化しなかった場合の値を、変数定義の右にコメントで書いています。
class Health {                // 初期化しないと
    int age;                  // 0
    double weight;            // 0.0
    double[] eye;             // null
    int[] prs = new int[2];   // 0, 0
    String name;              // null
    boolean flg;              // false
    static int bmiStd;        // 0

}
 なお、オブジェクト参照の変数を null のまま参照しようとすると、NullPointerException が発生します。
 いずれにしても、変数には使う前に適切に値を入れて使う方がよいと思います。

ローカル変数

 メソッド内で宣言する変数です。(Java ではローカル変数に static をつけることはできません。)

 初期化の扱い
  ローカル変数は、自動で初期化されません。初期化しないまま参照しようとすると、コンパイル・エラーになります。
  ただし、new で作成した配列は、上記の () と同じ扱いになります。

 【 ローカル変数の宣言 】
    public void myMethod() {  // 初期化しないと
       int n;                 // 参照部でコンパイル・エラー 
       double d;              // 参照部でコンパイル・エラー
       String s;              // 参照部でコンパイル・エラー
       double[] ds;           // 参照部でコンパイル・エラー
       boolean[] flgs = new boolean[5]; //各要素にfalseが入る

       // System.out.println( n );
       // System.out.println( d );
       // System.out.println( s );
       // System.out.println( ds );

       for( int i = 0; i < flgs.length; i++ )
           System.out.println( flgs[i] );
}
 n, d, s, ds は自動で初期化されないので、これらの変数を参照しようとすると、「初期化されていない可能性がある」というエラーになります(println のコメントをはずすと確認できます)。
 ローカル変数の場合も new を使って用意した配列は、メンバ変数と同じように要素の初期値が与えられます。 flgs を forループでプリントすると、false が 5つ表示されます。

(今回のクイズはありません)

前回のクイズは自習でした: (前回の問題を見る
(参考) たとえば ・・・
trim で前後の空白を除去したあと、split で空白や改行で区切り、分割されたものを全部つなぐ。
Matcher クラスや Pattern クラスを使って、パターンとマッチする部分を空文字列に置き換える。