[Java] Ch06_6. 初期化変数


Chapter06. オブジェクト向けプログラミングI


✏️ 6. 初期化変数


6.1初期化変数


変数を宣言し、値を最初に保存することを「変数の初期化」と呼びます.
メンバー変数は、初期化を必要とせずに変数データ型のデフォルト値に自動的に初期化できますが、領域変数は使用前に初期化する必要があります.
class InitTest {
	int x; // 인스턴스 변수
   	int y = x; // 인스턴스 변수   
    
    void method1() {
    	int i;  // 지역변수
        int j = i; // 에러. 지역변수를 초기화하지 않고 사용
    }
}
上記のコードでは、x,yはインスタンス変数であり、i,jは領域変数である.ここで、xおよびiは初期化されずに宣言されるだけである.そしてxでyを初期化し、iでjを初期化する.
インスタンス変数xは、int型のデフォルト値0、すなわち「int y=x;そうすることができます.xの値が0であるため、yも0を格納する.
ただし、method 1()の領域変数iは自動的に初期化されないため、初期化されていない場合に変数jの初期化に使用することはできない.コンパイル中にエラーが発生します.

▶タイプのデフォルト(default value)



▶メンバー変数の初期化方法


1.明示的初期化(明示的初期化)
2.コンストラクション関数(コンストラクション関数)
3.初期化ブロック
- インスタンス初期化ブロック:インスタンス変数を初期化する
- クラス初期化ブロック:クラス変数を初期化する

6.2明示的初期化


宣言と同時に変数を初期化することを明示的な初期化と呼びます.
class Car {
	int door = 4; // 기본형 변수의 초기화
    	Engine e = new Engine(); // 참조형 변수의 초기화
    
    //...
}
明示的な初期化は最も基本的で最も簡単な初期化方法であり,多様な初期化方法の中で優先的に考慮すべきである.
明示的に初期化が行われることを示していますが、より複雑な初期化操作が必要な場合は、初期化ブロックまたはコンストラクション関数を使用する必要があります.

6.3初期化ブロック


クラス初期化ブロック:クラス変数の複雑な初期化に使用します.
≪インスタンス初期化ブロック|Instance Initialization Block|emdw≫:インスタンス変数の複雑な初期化に使用します.
初期化ブロックを作成するには、インスタンス初期化ブロックはクラスにブロックを作成し、コードを記述するだけです.また、クラス初期化ブロックは、インスタンス初期化ブロックの前にstaticを追加するだけでよい.
初期化ブロックでは、条件文、重複文、例外処理文などをメソッドのように自由に使用でき、初期化操作が複雑で明示的な初期化だけでは不十分な場合は初期化ブロックを使用します.
class InitBlock {
	static { /* 클래스 초기화 블럭입니다. */ }
    
    	{ /* 인스턴스 초기화 블럭입니다. */ }
    
    	//...
}
クラス初期化ブロックは、クラスが初めてメモリにロードされたときにのみ実行され、インスタンス初期化ブロックは作成器と同様にインスタンスの作成時に実行されます.
(クラスが最初にロードされると、クラス変数は自動的にメモリに作成され、すぐにクラス初期化ブロックによってクラス変数が初期化されます.)
インスタンス変数の初期化は主にコンストラクション関数を使用し、インスタンス初期化ブロックはすべてのコンストラクション関数が共同で実行しなければならないコードを入れるために使用されます.

▶パースビュー1

public class BlockTest {
	static { 
		System.out.println("static { }"); // 클래스 초기화 블럭
	}
	
	{
		System.out.println("{ }"); // 인스턴스 초기화 블럭
	}
	
	public BlockTest() {
		System.out.println("생성자");
	}
	
	public static void main(String[] args) {
		System.out.println("BlockTest bt = new BlockTest(); ");
		BlockTest bt = new BlockTest();
		
		System.out.println("BlockTest bt = new BlockTest(); ");
		BlockTest bt2 = new BlockTest();
		
	}

}

実行例では、BlockTestがメモリにロードされると、クラス初期化ブロックが最初に実行され、staticが画面に出力されます.次にmainメソッドを実行してBlockTestインスタンスを作成し、まずインスタンス初期化ブロックを実行し、最後にジェネレータを実行する.
上記の実行結果から、クラス初期化ブロックは、メモリに最初にロードされたときに1回のみ実行され、インスタンス初期化ブロックはインスタンスの作成時に1回実行されることがわかります.

6.4メンバー変数の初期化時間と順序


クラス変数の初期化ポイント:クラスが最初にロードされたときに一度初期化されます.
インスタンス変数の初期化ポイント:インスタンスが作成されるたびに、各インスタンスが初期化されます.
クラス変数の初期化順序:デフォルト->明示的初期化->クラス初期化ブロック
インスタンス変数の初期化順序:デフォルト->明示的初期化->インスタンス初期化ブロック->作成者
プログラムの実行中にクラスの情報が必要な場合は、クラスがメモリにロードされます.
たとえば、クラスメンバーを使用する場合、インスタンスを作成する場合などです.
ただし、クラスがメモリにロードされている場合は、再ロードされません.もちろん、初期化は再実行されません.
class InitTest {
	static int cv = 1; // 명시적 초기화
    	int iv = 1;
    
    	static { cv = 2; } // 클래스 초기화 블럭
    
    	{ iv = 2; } // 인스턴스 초기화 블럭
    
    	InitTest() {
    		iv = 3;
    	}
}
上記の例では、「new InitTest();」に示すように、インスタンスを作成するときにcvとivの初期化プロセスについて説明します.
メモリには
  • cvが生成され、cvにはint型のデフォルト値0が格納されます.
  • 次に、明示的に初期化(int cv=1)してcvに1を格納する.
  • は最後にクラス初期化ブロック(cv=2)を実行し、cvには2が格納される.
  • InitTestクラスインスタンスの作成に伴い、ivはメモリに存在します.
    ivもint型変数なので、デフォルト値は0です.
  • はivに1
  • を記憶する明示的な初期化である.
  • インスタンス初期化ブロック、ivストレージ2.
  • 最後の生成者は
  • であり、ivには3が格納されている.
  • ▶パース2

    class Product {
    	static int count = 0; //생성된 인스턴스의 수를 저장하기 위한 변수
    	int serialNo;
    	
    	{ 
    		++count;
    		serialNo = count;  // Product인스턴스가 생성될 때마다 count의 값을 1씩 증가시켜서 serialNo에 저장한다.
    	}
    	
    	public Product() {} // 기본생성자, 생략 가능
    }
    
    public class ProductTest {
    
    	public static void main(String[] args) {
    		Product p1 = new Product();
    		Product p2 = new Product();
    		Product p3 = new Product();
    		
    		System.out.println("p1제품번호(serial no)는" +p1.serialNo);
    		System.out.println("p2제품번호(serial no)는" +p2.serialNo);
    		System.out.println("p3제품번호(serial no)는" +p3.serialNo);
    		System.out.println("생산된 제품의 수는 모두 " + Product.count + "개 입니다.");
    	}
    
    }
    

    プロダクトクラスインスタンスを作成するたびに、インスタンスブロックが実行され、クラス変数countの値が1増加し、インスタンス変数serialNoに格納されます.これにより、新しく作成されたインスタンスは、以前に作成されたインスタンスよりも1増加したSerialNoを有する.
    リファレンス
    ジャワ議政石(作者:南宮星)

    今日の一行


    オブジェクト向けプログラミング部1がやっと終了しました.関連部分を学習し整理し,位置づけたが,依然として混同された用語と概念がある.後でもっと多くの内容を学ぶことができることを望んで、そして復習の過程の中で熟知して完全に足元に立っています.勉強すればするほど内容は難しくなりますが、何が「対象」なのかという感覚が生まれ始めました.ジャワは本当に魅力的な言葉です.
    次にオブジェクト向けプログラミング部2に進み,継承を学習する.