#インスタンスの初期化
- コンストラクタで初期化処理を行う
- インスタンス変数は、インスタンス作成時に初期化される
※定数(final)もコンストラクタで初期化できる
クラスに定義された、初期化されていない定数は、コンストラクタで初期化できる
例)
public class Main{
public static void main(String[] args){
Sample a = new Sample(5);
System.out.println(a.num); //5と表示される
}
}
class Sample{
final int num; //この時点で定数フィールドは初期化されていない
Sample(int num){ //int num はインスタンス変数と同名のローカル変数
this.num = num; //コンストラクタで定数を初期化
}
}
#コンストラクタの共通処理を初期化する
- { } という初期化子(インスタンスイニシャライザ)を利用する
- コンストラクタがオーバーロードされて複数ある場合、共通処理をインスタンスイニシャライザで先に在以降できる
- インスタンスイニシャライザは、インスタンス化される直前に実行される
例)
public class Main{
public static void main(String[] args){
Sample a = new Sample(5); //「インスタンスイニシャライザを実行」
System.out.println(a.num); //5
Sample b = new Sample(); //「インスタンスイニシャライザを実行」
System.out.println(b.num); //10
}
}
class Sample{
final int num; //この時点で定数フィールドは初期化されていない
{
System.out.println("インスタンスイニシャライザを実行");
}
Sample(){
this.num = 10;
}
Sample(int num){
this.num = num; //コンストラクタで定数を初期化
}
}
#staticフィールドを初期化する
staticフィールドはインスタンスを生成しなくても利用できる。
そのため、コンストラクタで初期化できない
→static初期化子(イニシャライザ)で初期化する必要がある
例)
public class Main{
public static void main(String[] args){
System.out.println(Sample.num); //100と出力
}
}
class Sample{
static final int num; //この時点でstaticな定数は初期化されていない
static {
num = 100; //staticな定数の初期化
}
}
#初期化子が動作する順番
イニシャライザ→インスタンスイニシャライザ→コンストラクタ
例)
public class Main{
public static void main(String[] args){
User a = new User(); //「イニシャライザの実行 インスタンスイニシャライザの実行 コンストラクタの実行」と出力
}
}
class User{
private static int count;
static{
User.count = 0; //static変数を初期化
System.out.println("イニシャライザの実行");
}
{
System.out.println("インスタンスイニシャライザの実行");
}
User(){
System.out.println("コンストラクタの実行");
}
}