5

したがって、クラスにプライベート コンストラクターがある場合は初期化できませんが、コンストラクターがない場合は初期化できます。では、コンストラクターなしでクラスを初期化すると、何が呼び出されるのでしょうか?

例として、ここでは (new b())?? と呼びます。

public class a {
    public static void main(String args[]) {
        b classB = new b();
    }
}

public class b {
    public void aMethod() {
    }
}
4

5 に答える 5

9

Java には「コンストラクターのないクラス」というものはありません。ソース コードに明示的なコンストラクターがない場合、コンパイラーは自動的にデフォルトのコンストラクターをクラス ファイルに追加します。

public ClassName() {
  super();
}

これは、スーパークラスにパブリックまたは保護された引数なしのコンストラクタ自体がない場合、コンパイルに失敗する可能性があります。

于 2013-04-02T15:01:02.387 に答える
2

これは、デフォルト コンストラクターと呼ばれます。クラスがコンストラクターを明示的に定義していない場合、自動的に追加されます。

正式仕様:

クラスにコンストラクター宣言が含まれていない場合、パラメーターを取らない既定のコンストラクターが自動的に提供されます。
宣言されているクラスが基本クラス Object である場合、既定のコンストラクターは空の本体を持ちます。
それ以外の場合、デフォルトのコンストラクターはパラメーターをとらず、単に引数なしでスーパークラス コンストラクターを呼び出します。

于 2013-04-02T15:00:58.773 に答える
2

デフォルトの引数なしコンストラクターが呼び出されます - 詳細については、こちらを参照してください

于 2013-04-02T15:01:12.997 に答える
1

疑わしい場合は、 を使用してjavapください。

Empty.java:

public class Empty {
    public static void main(String[] args) {}
}

それで:

javac Empty.java
javap -v Empty.class

出力の抜粋:

public Empty();
  descriptor: ()V
  flags: ACC_PUBLIC
  Code:
    stack=1, locals=1, args_size=1
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

ハ!コンストラクターが生成されました。同じことを試してみると:

public class Empty {
    public Empty() {}
    public static void main(String[] args) {}
}

まったく同じバイトコードが表示されます。

これが Java のみの制限なのか、それともバイトコード レベルにも存在するのか、Is it valid to have a JVM bytecode class without any constructor? で質問しました。

于 2015-04-06T10:33:29.500 に答える