4

ASM ガイドでは、コンストラクターについて説明しています。

package pkg;
public class Bean {
  private int f;
  public int getF() {
      return this.f;
  }
  public void setF(int f) {
      this.f = f;
  }
}

Bean クラスには、コンパイラによって生成されるデフォルトのパブリック コンストラクタもあります。これは、プログラマが明示的なコンストラクタを定義していないためです。このデフォルトの public コンストラクターは として生成され Bean() { super(); }ます。このコンストラクタのバイトコードは次のとおりです。

ALOAD 0
INVOKESPECIAL java/lang/Object <init> ()V
RETURN

this最初の命令は、オペランド スタックをプッシュします。2 番目の命令は、この値をスタックからポップし、クラス<init> で定義されたメソッドを呼び出します。Objectこれはsuper() 呼び出し、つまりスーパークラスのコンストラクターへの呼び出しに対応しObjectます。ここで、コンストラクターはコンパイル済みクラスとソース クラスで異なる名前が付けられていることがわかります。コンパイル済みクラスではコンストラクターは常に名前が付けられますが、ソース クラスではコンストラクターが<init>定義されているクラスの名前が付けられます。最後に、最後の命令が呼び出し元に戻ります。

thisコンストラクターの最初の命令の前に、JVMは の値をどのように認識していますか?

4

2 に答える 2

5

JVM レベルでは、最初にオブジェクトが割り当てられ、初期化されず、そのオブジェクトに対してコンストラクターが呼び出されます。コンストラクターは、多かれ少なかれ、初期化されていないオブジェクトで実行されるインスタンス メソッドです。

Java 言語でもthis存在し、コンストラクターの最初の行にすべてのフィールドがあります。

于 2018-11-09T00:02:35.590 に答える