2

これが私が問題に遭遇した方法です。私は例を挙げています:

package check;

public class Check {
  int a,b;
  Check (int i,int j) {
    a = i;
    b = j;
  }
}

これで問題ありません。を拡張してサブクラスを作成したいと思いましたCheck。だから私は書いた:

class V extends Check {

}

書いてすぐにEclipseに十字架が現れ、それをクリックするとメッセージが見つかりました:

implicit super constructor Check() is undefined for default constructor. Must define an explicit constructor.

問題をグーグルで検索して追加しました

V (int i, int j) {
  super(i, j);
}

Eclipseもそれを提案していました。今、私は2つの質問があります。

  1. にコンストラクターを使用することが義務付けられているのはなぜclass Vですか? 知る限り、コンストラクターを作成する必要はありません。JAVAコンパイラーはデフォルトのコンストラクターを自動的に作成して操作を続行するためです。また、メッセージから、デフォルトのコンストラクターが必要なようですが、私が書いたものではありませんが、私が言ったように、JAVAは自動的に作成しませんか?
  2. もう 1 つ、サブクラスのコードをV(int i, int j){ super.a=i; super.b=j}. に変更しましたが、まだエラーが発生していました。何故ですか?このコードはsuper.a=i; super.b=jと同じではありませんsuper(i,j)か? また、クラス V では を使用する必要がないかもしれませんがb、なぜコンストラクターで初期化する必要があるのでしょうか?
4

7 に答える 7

4

1) コンパイラーは、コンストラクターを自分で定義しない場合にのみ、引数なしのコンストラクターを生成します。クラスCheckで、コンストラクターを定義しました。

2) 定義したコンストラクターで明示的にスーパークラス コンストラクターを呼び出さない場合、コンパイラーは引数のないコンストラクターへの呼び出しを生成します。クラスCheckには引数のないコンストラクターがないため、コンパイラーは呼び出しを生成できず、自分で作成する必要があります。

クラスのコンストラクターがなぜその親のコンストラクターを呼び出さなければならないのか疑問に思うかもしれません。これは、オブジェクトを使用する前に、オブジェクトが完全に初期化されていることを確認するためです。親コンストラクターは、それ自体のみがアクセスできるオブジェクトの一部の側面を初期化する場合があり、オブジェクトの作成時にコンストラクターを呼び出すことが、適切であることを確認する唯一の方法です。初期化。

于 2013-11-08T14:15:31.463 に答える
0

警告ではないと考えて、次のようなコードを記述します。

V v = new V();

では、コンパイラにどのような動作を期待しますか? つまり、引数なしのコンストラクターが定義されていません。明示的に追加する必要があります。

Check() {

}
于 2013-11-08T14:17:29.230 に答える
0
Why is it compulsory to use a constructor at all for class V?

これは、チェッククラスでは、パラメーター化されたコンストラクターを明示的に使用しており、クラス V のスーパークラスでもあるためです。したがって、パラメーター化されたコンストラクターについて言及していない場合は、パラメーター化されたコンストラクターを定義していない場合は、super() を明示的に呼び出す必要があります。チェッククラスのコンストラクターの場合、コンパイラーはデフォルトの引数のないコンストラクターを呼び出し、そこにオブジェクトクラスコンストラクターを呼び出す責任がある super() を配置します。

于 2013-11-08T14:33:21.253 に答える
0

クラスを作成するときにコンストラクターがない場合、Java はデフォルトのコンストラクターを提供します。ただし、1 つ以上のコンストラクターがある場合、Java はこのデフォルト (または引数なし) コンストラクターを提供しません。

サブクラスではまだコンストラクターを作成していないため、Java はデフォルトのコンストラクターを提供しています。サブクラスではsuper()、コンストラクターに暗黙的な呼び出しがあります。スーパークラスで引数なしのコンストラクターが定義されていないため、Java は事実上、まだ存在しないコンストラクターを呼び出そうとします。

于 2013-11-08T14:16:53.727 に答える