Java oop 17変数の初期化


初期化変数
領域変数(lv)は手動で初期化する必要があります(使用前に直接初期化する必要があります).
メンバー変数(iv,cv)は自動的に初期化されます.
自動初期化時のデフォルト
boolean false
char '\u0000'
byte,short,int 0
long 0L
float 0.0f
ダブル0.0 dまたは0.0
リファレンスnull
メンバー変数の初期化(iv,cv)
1.自動初期化:自動初期化は0
2.単純初期化:代入演算子(=)を使用
3.複雑な初期化:
iv-コンストラクション関数メソッド,{}(一般的にブロックは使用されません)
cv - static{ }
イニシャルポイント
クラス変数(cv):クラスを最初にロードするときに、1回実行します.
インスタンス変数(iv):インスタンス(オブジェクト)が作成されるたびに
class InitTest{
        int x;//x는 iv라서 자동초기화(x=0) 됐으니까 사용가능
        int y = x;
	
	void method1(){
		int i;
		/*lv는 재사용이 빈번해서 0으로 초기화하지 않고
		메서드 사용할때마다 값을 덮어쓴다.
		그래서 사용전에 매번 수동초기화 해줘야한다. */
	//	int j = i; 에러! 지역변수를 초기화하지 않고 사용해서
	}
}
    class Car{
        //2.간단초기화(명시적 초기화)
        int door = 4; //기본형 변수의 초기화
        Engine e = new Engine();//참조형 변수의 초기화
        //그냥 Engine e; 이렇게 쓰면 참조변수에 null값 들어가 있다. 이건 아무것도 아님.
        //그래서 Engine e = new Engine() 객체생성해서 객체의 주소를 참조변수 e에 담아줘야함.
        //그것이 참조변수의 초기화.
    }

class StaicBlockTest{

    static int[] arr = new int[10]; //명시적 초기화

    //int배열을 0으로 간단초기화했다.
    //그런데 int배열을 1~10사이의 난수로 초기화하고 싶으면 간단초기화로 불가능
    //static{ } 사용해서 복잡초기화해줘야 한다.

    static { //static{ }을 이용한 cv 복잡초기화
        for(int i=0;i<arr.length;i++) {
            arr[i] = (int)(Math.random()*10)+1;
        }
    }
}

class InitTest2{
    static int cv = 1; //간단초기화
    int iv = 1; //간단초기화

    static {   cv=2;   } //cv복잡초기화
    {   iv=2;   } //iv복잡초기화

    InitTest2(){//iv복잡초기화
        iv = 3;
    }
} 
初期化順序
1.cv -> iv
2.自動->単純->複雑
InitTest 2クラスオブジェクトを作成します.
InitTest2 it = new InitTest2();
1.cv初期化
自動初期化cv=0;->単純初期化cv=1;->複雑な初期化cv=2;
2.iv初期化
自動初期化iv=0;->単純初期化iv=1;->複雑な初期化cv=2;->複雑な初期化iv=3;