2

次のシナリオがある場合:

public class Foo extends Baz{
  private String banana = "banana";
  //blah blah blah
}


public class Baz{
  protected static String apple = "apple"; 
}

アップルとバナナのどちらが最初に作成されますか?アップルが最初に作成されると言いたいのですが、よくわかりません。

4

5 に答える 5

8

apple最初に作成されます。これは静的であり、親レベルのクラスにあります。

静的初期化子(apple変数を初期化する)は、クラスがロードされるとすぐに実行されます。Bazこれは、のインスタンスをBaz作成する前に実行する必要があります。

intsance初期化子(変数を初期化する)は、のインスタンスが作成さbananaれるとすぐに実行されます。Foo

于 2012-07-10T17:26:45.650 に答える
4

apple静的変数であるため、クラスの初期化時に初期化されます。これは、インスタンスを作成する前に発生するため、この特定のケースでは前に初期化されます。 banana

インスタンス変数の場合appleは、次の前に初期化されます。インスタンス変数は、コンストラクター本体の先頭でイニシャライザーが発生するかのように初期化されますが、スーパークラスコンストラクターへのチェーンの後で初期化されます。(興味がある場合は、これはC#とは異なります。C#では、インスタンス変数の初期化子がコンストラクターチェーンの前に実行されます。)banana

于 2012-07-10T17:27:45.367 に答える
2

クラスのインスタンスを作成するには、このクラスをロードして初期化する必要があるため、最初のインスタンスフィールドを初期化する前に、静的フィールドが初期化されることは明らかです。

于 2012-07-10T17:28:12.233 に答える
0

前に述べたように、apple最初に作成され、次にbanana作成されます。これが発生する理由は、Java言語仕様第12章で読むことができます。実行

于 2012-07-10T17:35:14.953 に答える
0

あなたが明確に与えBazたのは親クラスであり、Foo拡張していBazます。したがって、クラスが初期化されるたびに、親クラス変数が初期化されます。それもapple静的変数です。

静的変数は、インスタンス変数の前に初期化されます。それらが初期化されていない場合、intのデフォルト値は「0」になります。

于 2012-07-11T14:08:31.567 に答える