1

私のコード -

public abstract class Level1Class
{
  protected double num = 0.0D;  
  protected Level1Class(){}
  protected Level1Class(double num){this.num = num;}
  protected abstract methods A, B, C...etc //pseudocode !

}

public class Level2Class extends Level1Class
{
  //NO CONSTRUCTORS HERE
  //BUT, only implementation of methods A,B, C
} 

public class Tester
{
  Level2Class l2c = new Level2Class(10.0D); //This causes the compiler error ! 
}

このエラーが発生する理由を教えてください。Level2Classで必要なコンストラクターを作成すればうまくいくことはわかっています。でも、理由が知りたいです。

4

5 に答える 5

5

あなたが説明する動作の主な理由は、Java コンストラクターが継承されていないことです。クラスを作成するときは、次の 2 つの選択肢があります。

  1. コンストラクターをまったく指定しないでください (例のように)。この場合、コンパイラは自動的にデフォルトのコンストラクター (パラメーターなし) を追加します。

  2. 特定のコンストラクターを作成します (パラメーターありまたはなし)。この場合、定義したコンストラクターのみがクラスに存在し、コンパイラーはデフォルトのコンストラクターを追加しません。

あなたの例では、クラスLevel2Classでコンストラクターを定義していないため、コンパイラーはパラメーターなしでデフォルトのコンストラクターを追加します。パラメーターを持つコンストラクターがdoubleコンパイルされたクラスに存在しないため、エラーConstructor undefined

于 2012-12-14T09:02:49.773 に答える
3

Level2Classコンパイラによって実装される唯一のデフォルトコンストラクタがあります。Level2Classパラメータとして double を取るコンストラクタはありません。

Level2Class l2c = new Level2Class(10.0D);

Level2Classこれは、コンストラクターが継承されていないために利用できないクラス内の二重コンストラクターを見つけようとします。

于 2012-12-14T09:00:23.760 に答える
2

Level2Class クラスに double パラメーターを持つコンストラクターを作成する

public class Level2Class extends Level1Class
{
   Level2Class (double val)
   {
     // body of the constructor
   }
} 
于 2012-12-14T09:12:45.810 に答える
1

Javaのコンストラクターはポリモーフィックではありnew Level2Class(10.0D)ません。プログラムを呼び出すと、この場合はデフォルトのコンストラクターがわかりません。Level2Class(double)Level2Class()

コードをコンパイルした後に単に言うと、次のようになります。

Level2Class {
  Level2Class() { super(); }
}

Level2Class(double) { super(double) }したがって、これを機能させるにはコンストラクターを宣言する必要があります

于 2012-12-14T09:06:10.773 に答える
1

Java では、クラスが拡張されるたびに、パブリック メソッドと保護されたメソッドのみが継承され、コンストラクターは継承されません。

于 2012-12-14T09:06:20.610 に答える