クラス及びインスタンスの初期化
似ているけれども、同一ではない個々のインスタンスを作りだすのが初期化処理です。
初期化はコンストラクタで行うのが一般的ですが、初期化はそれだけではありません。
段階的に行われる初期化
1.
クラスロード時にスタティックイニシャライザが実行され、クラス変数(static変数)の初期化が行われる。
2.
クラスのフィールドで宣言した変数を既定値で初期化(初期値を代入)する。
3.
オブジェクトの生成時にインスタンスイニシャライザが実行される。
4.
次にコンストラクタが実行され、引数などによる初期化処理が行われる。
スタティックイニシャライザ
クラスのロード時、クラス変数を初期化するために使用します。
クラス変数はインスタンス化しなくても存在し、使える変数ですから初期化が必要です。通常は初期値の代入で行われますが大量の要素を初期化しなければいけないような場合には有効です。
スタティックイニシャライザはクラスのどこにでも、いくつでも記述できますが、ロード時に実行されるのでクラスの先頭から順方向で参照が行われることに注意して、適切な位置に記述する必要があります。
書式
static{
初期化処理
}
初期化処理
}
参考例
public class StaticInitializeSample { public static void main(String[] args) { System.out.print("static arrayの値は["); for(int num: StaticInitialize.array) { System.out.print( num ); } System.out.println( "]です。"); } } class StaticInitialize { static int[] array = new int[10]; //スタティックイニシャライザ static{ for (int i=0; i<array.length; i++) { array[i] = i; } } }
実行結果
>java StaticInitializeSample
static arrayの値は[0123456789]です。
static arrayの値は[0123456789]です。
>
なお、JVMがスタティックイニシャライザを処理中に何らかのトラブルが発生(例えばNullPointerException)した場合、そのことを通知するクラスが存在しないため、JVMはExceptionlnlnitializerErrorを発生させ、プログラムを強制終了させます。
インスタンスイニシャライザ(初期化ブロック)
インスタンス生成時にインスタンス変数(インスタンスごとに作成される変数)を初期化します。インスタンス変数は、通常コンストラクタで初期化しますが、オバーロードした複数のコンストラクタで共通する処理がある時にはインスタンスイニシャライザで一括して初期化すればプログラムの可読性が向上します。
なお、インスタンスイニシャライザはコンストラクタより先に実行されます。
書式
{ }に囲まれたブロックで、クラスブロック直下にフィールドやメソッド、コンストラクタと
同列の扱いで記述します。
同列の扱いで記述します。
参考例
public class InstanceInitializeSample { public static void main(String[] args) { StaticInitialize si1 = new StaticInitialize(); StaticInitialize si2 = new StaticInitialize("引数一つの"); System.out.println("インスタンスsi1は" + si1.constracterType + si1.postFix); System.out.println("インスタンスsi2は" + si2.constracterType + si2.postFix); } } class StaticInitialize { String postFix; String constracterType; //インスタンスイニシャライザ { postFix = "コンストラクタを使いました。"; } StaticInitialize() { this.constracterType = "デフォルト"; } StaticInitialize(String type) { this.constracterType = type; } }
実行結果
>java InstanceInitializeSample
インスタンスsi1はデフォルトコンストラクタを使いました。
インスタンスsi2は引数一つのコンストラクタを使いました。
インスタンスsi1はデフォルトコンストラクタを使いました。
インスタンスsi2は引数一つのコンストラクタを使いました。
>