package com;
public class Test {
public int k = 999;
static {
System.out.println("执行静态块");
//System.out.println("k = "+k); // 编译错误
}
{
System.out.println("执行动态块");
System.out.println("k = "+k); // 输入99
}
public Test() {
System.out.println("执行构建方法");
System.out.println("k = "+k); // 输入99
}
public static void main(String args[]) {
Test t = new Test();
}
}
- 上記の実行結果から導出される実行シーケンスは次のとおりです。
- 静的ブロック
- 動的コードブロック
- 引数のないコンストラクター
- 質問 1: オブジェクト (Java クラスのインスタンス) の作成とは何ですか? jvm は新しいオブジェクトにメモリ領域を割り当て、ヒープ内のオブジェクトを初期化します。どちらが先に行われますか?
- 回答: オブジェクト (Java クラスのインスタンス) の作成は 2 つのステップに分かれています。
- ステップ 1: ヒープ メモリ内にメモリ領域を割り当てます。
- ステップ 2: オブジェクトを初期化します。
- 質問 2: jvm はヒープ メモリ内の新しいオブジェクトにメモリ領域を割り当てますが、メモリ領域は正確には何に割り当てられますか?
- 回答: ヒープ内のオブジェクトにメモリ領域を割り当てることは、実際にはオブジェクトのメンバ変数にヒープ メモリ領域を割り当てることになります。例えば、上記の Test.java クラスがオブジェクトを作成する場合、ヒープメモリに確保されるメモリ空間は、メンバ変数 int k = 99 に割り当てられた空間(12 バイト)になります。
- 質問 3: オブジェクトの初期化が完了するとは何ですか?
- 回答: 新しいオブジェクト内のすべてのメンバー変数が初期化されている場合は、オブジェクト全体が初期化されていることを意味します。
- 質問 4: 引数なしのコンストラクターの実行を開始する前に、JVM はこの新しいオブジェクト用にヒープ内のヒープ メモリ領域を割り当てましたか? 引数なしのコンストラクターの実行を開始する前に、新しいオブジェクトの初期化は完了していますか? 引数なしのコンストラクターが実行されると、オブジェクトが作成されますか? 引数なしのコンストラクターが実行されるとき、オブジェクトはすでに作成されていますか? それとも、オブジェクトは引数なしのコンストラクターの実行中に作成されますか? それとも、引数なしのコンストラクターのメソッドが実行された後にオブジェクトが作成されますか?
- 回答: コンストラクターを実行する前に、jvm はヒープ メモリ内のこの新しいオブジェクトにヒープ メモリ領域を割り当て、また jvm は新しいオブジェクトを初期化します。
- 証明: オブジェクト作成の実行順序は、静的コードブロック > 動的コードブロック > 引数なしコンストラクタであり、動的コードブロックを実行すると「k = 99」が出力されるため、オブジェクトは、引数なしのコンストラクタ(ヒープメモリ上にメモリ領域を確保し、オブジェクトを初期化する)が完了しました。
- 質問 5: 空のクラス (Object obj = new Object() などのメンバー変数なし) がオブジェクトを作成するとき、jvm がヒープ メモリ内でこの新しいオブジェクトに何バイト割り当てるか知っていますか? メンバー変数のないオブジェクトはヒープ メモリ内で何バイトを占有しますか?
- 答え: 8 バイトです。すべてのクラスは Object.java クラスから継承されており、Object.java クラスのオブジェクトは 8 バイトを占有するためです。ただし、Object.java クラスにはメンバー変数がないことに注意してください。
- 質問 6: メンバー変数を含むオブジェクトはヒープ メモリ内で何バイトを占有しますか?
- 答え: 8 + このオブジェクトがヒープ メモリ内で占有するバイト数。
- 質問 7: 上記の Test.java クラスの場合、オブジェクトの作成時に、jvm はヒープ メモリ内のオブジェクトに何バイトのヒープ メモリ領域を割り当てますか?
- 答え: 12 バイトです。継承された new Object() は 8 バイトを占有し、int k = 99; であるため、Test.java 自体には 4 バイトのヒープ メモリ領域が割り当てられるため、合計で 12 バイトになります。
- 質問 9: 参照変数は何を保持しますか?
- 回答: 参照変数には、オブジェクトを指すアドレスが含まれています。
- 質問 9: 参照メンバー変数は何バイトを占めますか?
- 回答: 必ずしもそうとは限りませんが、わかりません。占有バイト数は使用しているマシンのビット数に関連しており、仮想空間に関連しているため、参照変数が占有しているバイト数を正確に伝えることのできるデータはありません。一般的には 4 バイトか 8 バイトですが、不確実です。これはマシンとマシンのアドレス空間に関係します (参照変数にはアドレスが含まれているため、アドレス空間の関係に関係します)。 。
- 質問 10: ヒープ、メソッド領域、スタックには何が入っていますか? Stack_heap_method area_stack Frame_memory プログラム実行の変更処理 - ナレッジ
- ヒープ
- メンバー変数
- メソッド領域
- 静的変数
- メソッドスタックフレーム
- メソッド内のローカル変数
- Alibaba の筆記試験問題: Java 静的コード ブロック、静的関数、動的コード ブロック、コンストラクターなどの実行順序。