次のJavaコードでは、Insectクラスはビートルクラスによって継承されています。Java - このコードの初期化の順序は何ですか?
class Insect {
private int i = 9;
protected int j;
Insect() {
System.out.println("i = " + i + ", j = " + j);
j = 39;
}
private static int x1
= printInit("static Insect.x1 initialized");
static int printInit(String s) {
System.out.println(s);
return 47;
}
}
public class Beetle extends Insect {
private int k = printInit("Beetle.k initialized");
public Beetle() {
System.out.println("k = " + k);
System.out.println("j = " + j);
}
private static int x2
= printInit("static Beetle.x2 initialized");
public static void main(String[] args) {
System.out.println("Beetle constructor");
Beetle b = new Beetle();
}
}
出力はどうにかして複雑です。
静的Insect.x1は
静的Beetle.x2は
を初期化する初期化ビートルコンストラクタ
I 0
Beetle.kが
Kを初期化= = 9、J = 47j = 39
この特定の例での初期化の順序は何ですか?
なぜx1はx1の後に即座に初期化されるのですか?そして、なぜ、メインメソッド(System.out.println("Beetle constructor");
)の最初の行は、 x1とx2の初期化の後にを実行したのですか?とても楽しいです。
派生クラスのコンストラクタは、パラメータを持たずにスーパーキーワードを使用する場合を除き、自動的に基本クラスのコンストラクタを呼び出します。私は変数がコンストラクタの前に初期化され、静的変数は他の変数の前に初期化されることを知っています。
メンバ(プリミティブと参照)が初期化されます 4.基底クラスのコンストラクタが呼び出されます 5.派生クラスの非静的メンバーは初期化されます 6.最後に、オブジェクトを作成するために必要なものがすべてあるので、派生クラスのコンストラクタが呼び出されます。 私は正しいですか? –
@HelloLiliこの単純なケースでははいですが、私は原則としてそれを使用することに注意します。 Javaは、Java言語仕様で定義された一連の規則によって動作します。私は、あなたが特定の行動がどのように誘発されるかを学ぶことで、より良いと思う。 「静的メンバー」の代わりに、「静的メンバーの初期化をトリガーするクラスの読み込み」などを覚えておいてください。 –