1

これは私の単純なJavaコードです。プログラムをコンパイル/実行すると、EclipseIDEに構文エラーが表示されます。構文エラーは私には意味がありません

class A {
    int x;
    int z;
    int s;

    A(int a,int b) {
        x=a;
        z=b;
    }

    void display() {
        System.out.println("x+y :"+(x+z));
    }
}

class B extends A
{
    B(int a, int b, int c) {
        x=a;
        z=b;
        s=c;
    }

    void display() {
        System.out.print("In B class...");
        System.out.println("x+y+s :"+(x+z+s));
    }
}

public class Simple {
    public static void main(String[] args) {
        A ob=new A(10, 20);
        B ob2=new B(20, 30, 40);
        ob.display();
        ob2.display();
    }
}
4

8 に答える 8

3

クラスAで、2つのパラメーターを受け入れるコンストラクターを提供し、Aのパラメーターなしのコンストラクターを定義していません。そのため、Aを拡張するBをインスタンス化しようとすると、呼び出すことができないため失敗します。A()

これを解決するには2つの方法があります。

  • Aにパラメーターのないコンストラクターを提供する

何かのようなもの:

class A{
    int x;
    int z;
    int s;

    public A(){
    }

    public A(int a,int b){
        x=a;
        z=b;
    }

    void display(){
        System.out.println("x+y :"+(x+z));
    }
}
  • Bのコンストラクターの最初のステートメントとしてsuper(a、b)を呼び出します。

例えば:

class B extends A
{
    B(int a, int b, int c){
        super(a,b);
        x=a;
        z=b;
        s=c;
    }

    void display(){
        System.out.print("In B class...");
        System.out.println("x+y+s :"+(x+z+s));
    }
}

Javaを初めて使用する場合は、Javaでの継承とオブジェクトの作成について読むことをお勧めます

于 2012-09-22T06:21:14.863 に答える
1

ここで考慮する必要があることがいくつかあります:-

  • コンストラクターなしでクラスを宣言すると、コンパイラーはデフォルトのコンストラクター、つまり空のゼロ引数コンストラクターを挿入することによってそれを行います。
  • 1引数コンストラクター(またはその他のコンストラクター)を明示的に宣言した場合、コンパイラーはデフォルトのコンストラクターを追加しません。
  • クラスのインスタンスを作成するたびに、コンストラクターは継承階層のトップダウンから呼び出されます。したがって、継承を使用していない場合、クラスをインスタンス化すると、最初にObjectクラスのコンストラクター(継承または非継承階層の最上位クラス)が呼び出されます。
  • super()を使用してスーパークラスコンストラクターを呼び出しますが、明示的に行っていない場合は、コンパイラーがこれを追加します。自分で追加する場合は、コンストラクターの最初のステートメントであることを確認してください。引数をsuperに渡して、スーパークラスの非ゼロ引数コンストラクターを呼び出すことができますが、コンパイラーはゼロ引数super()のみを追加します。

さて、それをすべて言ったので、コードに移りましょう。クラスAで、3引数のコンストラクターを宣言したので、コンパイラーは何も追加しません。つまり、正確には、ゼロ引数のコンストラクターはありません。そこの。ここで、クラスBはAを拡張するため、そのクラスをインスタンス化すると、ここではAであるスーパークラスコンストラクターが呼び出されます。これで、Bクラスにsuper()呼び出しが追加されていないため、コンパイラーはそこに自動的に追加します。しかし、コンパイラーが追加するのは、 super()です。これは、Aのゼロ引数コンストラクターを呼び出します。これは、持っていないことがわかりました。

それで、どうやってそれを解決することができますか?

クラスAにデフォルトのコンストラクターを追加するか、次のようにします。

class A {
    public A() {
    }
}

または、Bのコンストラクターの最初のステートメントとして明示的なsuper()呼び出しを追加して、3引数のAのコンストラクターを呼び出します。

class B extends A {
    public B(int a, int b) {
          super(a, b, 19);
          /* More Code */
    }
}

super()と同様に、コンストラクターでthis()を使用して、同じクラスのコンストラクターを呼び出すこともできます。this()にも同じルールが適用されます。コンストラクターの最初のステートメントである必要があります。

したがって、コンストラクターにsuper()またはthis()を含めることができることがわかります。

これだけの情報が少なくともあなたの現在の問題を解決することを願っています。

于 2012-09-22T15:13:47.613 に答える
0

クラスの定義「クラスA」はどこにありますか?データフィールドの定義はどこにありますか(クラスBの場合はx、z、s、クラスAの場合はx、z)?投稿を編集してください

投稿を編集した後、コンパイルしようとしましたが、エラーは次のようになります。

Simple.java:17:シンボルシンボルが見つかりません:コンストラクターA()場所:クラスA B(int a、int b、int c){^1エラー

つまり、BはAを拡張するため、クラスBを作成するときにクラスAのコンストラクターを呼び出す必要があります。独自のコンストラクターを作成したため、デフォルトのコンストラクターはありません。

Bのコンストラクターを次のように書き直せば、問題はありません。

B(int a, int b, int c){
    super(a,b);
    s=c;
}

幸運を!

于 2012-09-22T06:16:32.770 に答える
0

書式設定(の欠如)により、読みにくくなります。クラスAの定義の開始は、コードブロックの外側にあります。

クラスBでintフィールドを定義しなかったようです。次のようになります。

 class B extends A
 {
     int s;

  ...
  }

編集:私が答えを投稿している間に、あなたが再フォーマットして変更したようです...

于 2012-09-22T06:20:28.740 に答える
0

クラスAのコンストラクターを明示的に宣言しているので、クラスBは親の-クラスA-コンストラクターを明示的に呼び出す必要があります。

以下のコードをクラスBのコンストラクターに追加します。

super(a, b);

次に、クラスBのコンストラクターは次のようになります。

B(int a, int b, int c) {
    super(a, b);
    x = a;
    z = b;
    s = c;
}

PS、plsはあなたが貼り付けたコードのフォーマットを処理します。読みにくいです。

于 2012-09-22T06:25:35.367 に答える
0

スーパークラスには2つの引数のコンストラクターがあります。クラスBのコンストラクターでクラスAを拡張すると、スーパークラスの2つの引数のコンストラクターが呼び出されます。サブクラスコンストラクタコードをこれに変更します。

B(int a, int b, intc) {
   super(a,b); //this has to be in the first line inside the constructor.
    //do your things
  }

このリンクはそれを説明しています

于 2012-09-22T06:40:29.363 に答える
0

スーパークラスで定義されているプロパティに値を設定する場合は、サブクラスコンストラクターでsuper()メソッドを呼び出します。

したがって、サブクラスコンストラクタは次のようになります。

public B(int a, int b, int c){
    // The following statement will automatically sets the values to the base class             properties (which are already derived into derived class).
    super(a, b);
    // No Need of setting the values to the super class properties... The above statement will automatically sets the values...
    s=c;
}
于 2012-09-22T07:41:34.903 に答える
-1

まず、eclipseによって与えられたエラーを投稿すると役に立ちます。

ただし、いずれの場合も、構文エラーは、x、z、sなどの変数のデータ型を定義していないという事実に起因しています。

例えば、

int x = a;
int z = b;

于 2012-09-22T06:18:11.647 に答える