次のシナリオがある場合:
public class Foo extends Baz{
private String banana = "banana";
//blah blah blah
}
public class Baz{
protected static String apple = "apple";
}
アップルとバナナのどちらが最初に作成されますか?アップルが最初に作成されると言いたいのですが、よくわかりません。
次のシナリオがある場合:
public class Foo extends Baz{
private String banana = "banana";
//blah blah blah
}
public class Baz{
protected static String apple = "apple";
}
アップルとバナナのどちらが最初に作成されますか?アップルが最初に作成されると言いたいのですが、よくわかりません。
apple
最初に作成されます。これは静的であり、親レベルのクラスにあります。
静的初期化子(apple
変数を初期化する)は、クラスがロードされるとすぐに実行されます。Baz
これは、のインスタンスをBaz
作成する前に実行する必要があります。
intsance初期化子(変数を初期化する)は、のインスタンスが作成さbanana
れるとすぐに実行されます。Foo
apple
は静的変数であるため、クラスの初期化時に初期化されます。これは、インスタンスを作成する前に発生するため、この特定のケースでは前に初期化されます。 banana
インスタンス変数の場合apple
は、次の前に初期化されます。インスタンス変数は、コンストラクター本体の先頭でイニシャライザーが発生するかのように初期化されますが、スーパークラスコンストラクターへのチェーンの後で初期化されます。(興味がある場合は、これはC#とは異なります。C#では、インスタンス変数の初期化子がコンストラクターチェーンの前に実行されます。)banana
クラスのインスタンスを作成するには、このクラスをロードして初期化する必要があるため、最初のインスタンスフィールドを初期化する前に、静的フィールドが初期化されることは明らかです。
前に述べたように、apple
最初に作成され、次にbanana
作成されます。これが発生する理由は、Java言語仕様の第12章で読むことができます。実行:
あなたが明確に与えBaz
たのは親クラスであり、Foo
拡張していBaz
ます。したがって、クラスが初期化されるたびに、親クラス変数が初期化されます。それもapple
静的変数です。
静的変数は、インスタンス変数の前に初期化されます。それらが初期化されていない場合、intのデフォルト値は「0」になります。