ホームページ  >  記事  >  Java  >  Java でクラスとオブジェクトを初期化する方法

Java でクラスとオブジェクトを初期化する方法

王林
王林転載
2023-04-18 11:55:021567ブラウズ

まず、次のコードを見てみましょう。これは非常に古典的な検査方法です。

public class InitField {      public static void main(String[] args) {          SuperInitField p = new SuperInitField();          SuperInitField c = new SubInitField();      }  }   class SuperInitField {      public SuperInitField() {          System.out.println("parent");      }      static {          System.out.println("static parent");      }   }   class SubInitField extends SuperInitField {      public SubInitField() {          System.out.println("child");      }      static {          System.out.println("static child");      }  }

正しい答えをすぐに書けるかどうかに関係なく、まずこのプログラムを脇に置き、Java 仮想マシンの初期化の原理を理解しましょう。

JVM は、実行中の Java プログラムでその型を使用できるように、Java 型をインストール、接続、初期化します。この型のライフ サイクルを次の図に示します。

Java でクラスとオブジェクトを初期化する方法

読み込みと接続は、初期化の前に完了する必要があります。

クラス初期化フェーズは主に、クラス変数に正しい初期値を割り当てることです。ここでの「正しい」初期値とは、プログラマがこのクラス変数に期待する開始値を指します。正しい初期値は、クラス変数初期化ステートメントまたは静的初期化ステートメントを通じて指定されます。クラスの初期化には 2 つの手順が必要です。

1) クラスに直接スーパークラスがあり、その直接スーパークラスが初期化されていない場合は、最初に直接スーパークラスを初期化します。

2) クラスにクラス初期化メソッドがある場合は、このメソッドを実行します。

クラスはいつ初期化されますか? Java 仮想マシンの仕様では、クラスの初期化タイミングが厳密に定義されており、クラスがアクティブに使用されるときに初期化されます。

それでは、***による積極的な使用の基準を満たすのはどのような状況でしょうか? Java 仮想マシン仕様では、次のように説明されています:

1) クラスの新しいインスタンスを作成します;

2) クラスの静的メソッドを呼び出します;

3 ) クラスまたはインターフェイスの静的フィールドを操作します (最終フィールドを除く);

4) Java の特定のリフレクション メソッドを呼び出します;

5) クラスのサブクラスを初期化します;

6) Java仮想マシン起動時の初期化クラスとしてクラスを指定します。

上記の 6 つの状況を除き、他のすべてのメソッドは受動的に使用され、クラスの初期化は発生しません。

クラスをロード、接続、初期化すると、使用できるようになります。次に、オブジェクトのインスタンス化に焦点を当てましょう。オブジェクトのインスタンス化と初期化は、オブジェクトの存続期間の初期段階におけるアクティビティです。

Java コンパイラは、コンパイルするクラスごとに少なくとも 1 つのインスタンス初期化メソッド、つまり () メソッドを生成します。ソース コード内の各クラス コンストラクターには、対応する () メソッドがあります。クラスがコンストラクターを明示的に宣言していない場合、コンパイラはそのクラスのデフォルトの引数なしコンストラクターを生成します。このデフォルト コンストラクターは、親クラスの引数なしコンストラクターのみを呼び出します。

() メソッドには、別の gt;() メソッドの呼び出し、インスタンス変数の初期化、およびメソッド本体コードの構築という 3 つのタイプのコード コンテンツが含まれる場合があります。
同じクラス内の別のコンストラクターを呼び出すことによってコンストラクターが明示的に開始される場合、対応する () メソッド本体に含まれる内容は次のとおりです。

  1. #< への呼び出しこのクラスの ;init>() メソッド;

  2. は、構築メソッドに対応するメソッド本体のバイトコードを実装します。

構築メソッドが独自のクラスの他の構築メソッドを呼び出すことによって開始されず、オブジェクトが Object オブジェクトではない場合、() に含まれるコンテンツはメソッドは:

  1. 親クラスの() メソッドの呼び出し;

  2. インスタンス変数初期化メソッドのバイトコード;

  3. 構築メソッドに対応するメソッド本体のバイトコードを実装します。

上記の説明は、Java 型の初期化を理解するのに役立ちましたか?

さて、コードの先頭をもう一度分析してみましょう:

SuperInitField p = new SuperInitField();  //SuperInitField的超类是Object  //创建SuperInitField对象,属于***主动使用,因此要先初始化Object类,然后再调用SuperInitField类变量初始化语句或者静态初始化语句,所以要输出static parent  //类被装载、连接和初始化之后,创建一个对象,因此需要首先调用了Object的默认构造方法,然后再调用自己的构造方法,所以要输出parent    SuperInitField c = new SubInitField();  //SubInitField继承自SuperInitField  //创建SubInitField对象,属于***主动使用,父类SuperInitField已被初始化,因此只要调用SubInitField类变量初始化语句或者静态初始化语句,所以要输出static child  //类被装载、连接和初始化之后,创建一个对象,因此需要首先调用了SuperInitField的构造方法,然后再调用自己的构造方法,所以要输出parent,然后再输出child
これまでに、Java クラスの初期化の原則については大体理解できたはずなので、演習問題に任せておきます。 . 、次のコードの結果を記述します。

rree

以上がJava でクラスとオブジェクトを初期化する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。