0

ここで自分のコンセプトを明確にしたかったので、質問しています...

自分のクラスに明示的なパラメーター化されたコンストラクターを定義した場合でも、Java コンパイラーによって提供されるデフォルトのコンストラクター (デフォルトですべてのクラスに提供されます) を呼び出すことはできますか??

または、そのような場合にコンパイル時エラーが発生しますか?? コンパイラによる呼び出しに関して正確に何が起こるか説明してください!!

4

7 に答える 7

11

コンストラクターが指定されていない場合に限り、 引数のないコンストラクターがコンパイラーによって作成されます。

JLS は第 8 章で次のように述べています。

クラスにコンストラクタ宣言が含まれていない場合、仮パラメータも throws 節もないデフォルト コンストラクタが暗黙的に宣言されます。

1つの「キャッチ」は次のとおりです。

デフォルトのコンストラクターが暗黙的に宣言されているが、スーパークラスに、引数を取らず、throws 句を持たないアクセス可能なコンストラクター (§6.6) がない場合、コンパイル時エラーになります。

于 2012-05-31T04:16:57.710 に答える
2

Java言語仕様は驚くほど役に立ち、実際に読みやすいものになります。

于 2012-05-31T04:20:22.667 に答える
2

パラメーター化されたコンストラクターを定義するだけの場合、コンパイラーはデフォルトのコンストラクターを提供しません

エラーが出力されます

于 2012-05-31T04:18:31.133 に答える
2

8.8.9 デフォルトのコンストラクタ

クラスにコンストラクター宣言が含まれていない場合、パラメーターを取らないデフォルトのコンストラクターが自動的に提供されます。

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

.

于 2012-05-31T04:19:39.717 に答える
2
  • コンストラクターを持たないすべてのクラスごとに、Java はデフォルトのコンストラクターを自動的に追加します。これには引数がありません。そして、引数のスーパーコールはありません。
  • クラスに少なくとも 1 つのコンストラクターを追加すると、Java にはデフォルトのコンストラクターが含まれません。
  • その結果、引数なしのコンストラクターを使用しようとすると、コンパイル エラーが発生します。

それに加えて、これにより追加のコンパイル エラーが発生する可能性があります。このコードをテストします。

class A{
  A(int i){}
}

class B extends A{}

class Test{
  PSVM{
    B b = new B();
  }
}

このコードでは、コンパイル エラーが発生します。

クラス B にはコンストラクターがありません。したがって、Javaはこのようなものをデフォルトのコンストラクターとして配置します。

B(){
  super();
}

しかし、クラス A (クラス B) の Supper クラスには、引数を取らないコンストラクタがないため、コンパイル エラーが発生します。

そのため、記述している各クラスに引数なしのコンストラクターを用意することをお勧めします。

于 2012-05-31T04:34:04.147 に答える
1

クラスにコンストラクタ宣言が含まれていない場合、仮パラメータも throws 節もないデフォルト コンストラクタが暗黙的に宣言されます。

宣言されているクラスが基本クラスの Object である場合、デフォルトのコンストラクターは空の本体を持ちます。それ以外の場合、デフォルト コンストラクターは引数なしでスーパークラス コンストラクターを呼び出すだけです。

既定のコンストラクターが暗黙的に宣言されているが、スーパークラスに、引数を取らず、throws 句を持たないアクセス可能なコンストラクターがない場合、コンパイル時エラーになります。

クラス型では、クラスが public と宣言されている場合、既定のコンストラクターには暗黙的にアクセス修飾子 public が与えられます。クラスが保護されていると宣言されている場合、デフォルトのコンストラクターには暗黙的にアクセス修飾子 protected が与えられます。クラスが private と宣言されている場合、デフォルトのコンストラクターにはアクセス修飾子 private が暗黙的に与えられます。それ以外の場合、既定のコンストラクターには、アクセス修飾子がないことによって暗黙的に示される既定のアクセスがあります。

于 2012-05-31T05:08:07.230 に答える
1

Java は、コンストラクターが明示的に定義されていないクラスに対してのみ、デフォルトの引数なしコンストラクターを提供します。コンストラクターがプログラマーによって定義されると (引数のないコンストラクターであっても)、既定のコンストラクターは提供されません。

今、あなたはエラーについて尋ねていました:

  • クラスに引数なしのコンストラクターを定義した場合、クラスのコンストラクターを引数なしで呼び出すと、このコンストラクターが呼び出され、コンパイラ エラーはスローされません。
  • 引数を受け入れるコンストラクターのみを定義した場合、クラスのコンストラクターを引数なしで呼び出すと、引数なしのコンストラクターが存在しないため、コンパイラ エラーが発生します。

Java言語仕様を徹底的に読むことをお勧めします

于 2012-05-31T04:34:20.313 に答える