27

Javadocは、Objectクラスにはパブリックの引数なしコンストラクターがあると述べています。ただし、Objectのソースコードには明示的なコンストラクターが含まれていません。したがって、明らかにコンパイラはそのために1つ生成しました。ただし、コンストラクターが返そうとしているときに呼び出しスタックのトレースが表示された場合(以下に示すように)、そのトレースにはへの呼び出しは表示されませんObject.<init>

だから問題は、ドキュメントが言うように、オブジェクトクラスにはデフォルトのコンストラクタがありますか?はいの場合、コールスタックトレースに表示されないのはなぜですか?

public ConTest()
{
    new Throwable().printStackTrace();
}

結果:

java.lang.Throwable
    at ConTest.<init>(ConTest.java:8)
    at ConTest.main(ConTest.java:16)
4

5 に答える 5

24

スーパーコンストラクターは、サブ/ベースコンストラクターの前に実行されます。あなたの例では、オブジェクトのコンストラクターは、が実行されたときにすでに実行されていnew Throwable().printStackTrace()ます。

コードのより明示的なバージョン:

public ConTest()
{
    super();
    new Throwable().printStackTrace(); // you will not see super() (Object.<init>) in this stack trace.
}
于 2012-08-22T05:57:59.740 に答える
6

すでに呼び出されているため、スタックトレースには表示されません。例外がコードでスローされます。

あなたのコードは書くことと同等です:

public ConTest() {
  super(); // this will call the Object constructor
  new Throwable().printStackTrace();
}
于 2012-08-22T05:59:39.527 に答える
6

スーパークラスのコンストラクターが呼び出される前に呼び出されるため、スタックトレースには表示されませんnew Throwable().printStackTace()。コンパイラが実際に作成するのは次のとおりです。

public ConTest()
{
    super();   // This is the call to the base class constructor
    new Throwable().printStackTrace();   // already back from the base class constructor
}
于 2012-08-22T06:00:33.763 に答える
6

はい、ドキュメントにあるように、Objectクラスにはデフォルトのコンストラクタがあります。

コマンドプロンプトでjavap-cConTestを使用して確認できます。これは、以下のコードの行番号:1でオブジェクトクラスのデフォルトコンストラクター()を呼び出していることがわかります。

C:\stackdemo>javap -c ConTest
Compiled from "ConTest.java"
public class ConTest extends java.lang.Object{
public ConTest();
  Code:
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
   4:   new     #2; //class java/lang/Throwable
   7:   dup
   8:   invokespecial   #3; //Method java/lang/Throwable."<init>":()V
   11:  invokevirtual   #4; //Method java/lang/Throwable.printStackTrace:()V
   14:  return

public static void main(java.lang.String[]);
  Code:
   0:   new     #5; //class ConTest
   3:   dup
   4:   invokespecial   #6; //Method "<init>":()V
   7:   astore_1
   8:   return

}

ありがとうございました

于 2012-10-05T12:00:44.670 に答える
2

上記で提案したように、super()はコンストラクターでの最初の呼び出しであり、メソッドの詳細についてはこちらをご覧ください

クラスをコンパイルすると、Javaコンパイラは、クラスのソースコードで宣言するコンストラクタごとにインスタンス初期化メソッドを作成します。コンストラクターはメソッドではありませんが、インスタンスの初期化メソッドはメソッドです。名前<init>、、戻り型、void、および生成元のコンストラクターのパラメーターと一致するパラメーターのセットがあります。

于 2012-08-22T06:04:47.840 に答える