5

Java認定試験の勉強で、静的初期化ブロックはソースコード内の出現順に、クラスがロードされたときに1回実行されること、インスタンス初期化ブロックはインスタンスが作成されるたびに実行されること、コンストラクタ内のコードは毎回実行されることを学びましたその後、インスタンスが作成されます。いくつかの静的およびインスタンスの初期化ブロックを持つクラスと、印刷用のものを持つコンストラクターを作成したことをテストします。すべてが期待どおりに機能しました-「ロード」は実行時だけを意味すると思っていましたが、クラスのインスタンスを少なくとも1つ作成しない限り、出力がまったく得られないため、最初のインスタンスが作成されたときに発生すると思います。次に、列挙型で同じことを試みましたが、順序はすべてオフでした。まず、列挙型がコードで最初に参照されるときに、列挙型が持つ各値に対して初期化ブロックが 1 回実行されます。第 2 に、インスタンスの初期化ブロックであると想定した後に静的実行とマークされた初期化ブロックです。これは私の予想とは逆です。これが私の質問の内訳です。

  1. static run とマークされた init ブロックが列挙型の最後にあるのはなぜですか?
  2. 列挙型はインスタンスの初期化ブロックを持つことができますか?
  3. インスタンスの初期化ブロックだと思っていたブロックが、新しい enum 値が参照されるたびにではなく、enum がロードされたときに 1 回だけ実行されるのはなぜですか?
  4. クラスの静的初期化ブロックは、クラスが「ロード」されるときに実行されます。ロードされた とはどういう意味ですか? オブジェクトがクラスでインスタンス化されるときに一度だけ発生しますか?

ありがとう!これは私を非常に混乱させます。

public class EnumInit {
public static void main(String[] args) {
    System.out.println(Color.RED.toString() + " Main");
    MyInit myInit = new MyInit();
    System.out.println(Color.BLUE.toString() + " Main");
    MyInit mySecondInit = new MyInit();

}
}

enum Color {    
RED, BLUE, GREEN;
String instanceVar = "Enum Instance Variable Text";
static { System.out.println("Enum Static init block 1"); }
{ System.out.println("Enum Instance init block 1"); }
static { System.out.println("Enum Static static init block 2"); }
Color() { 
    System.out.println(instanceVar);
    System.out.println("Enum String Literal"); 
}
{ System.out.println("Enum Instance init block 2"); }   
}

class MyInit {
String instanceVar = "Class Instance Variable Text";
static { System.out.println("Class Static init block 1"); }
{ System.out.println("Class Instance init block 1"); }
static { System.out.println("Class Static static init block 2"); }
MyInit() { 
    System.out.println(instanceVar);
    System.out.println("Class String Literal"); 
}
{ System.out.println("Class Instance init block 2"); }  
}
4

2 に答える 2