1

super と this キーワードを使用して、単純な Java 継承プログラムを作成しようとしています。ここでは、2 学期 sem1 と sem2 の 3 つの科目の学生の成績を示しています。私は合計点を表示したい。S1T(Sem1 合計)、S2T(Sem 2 合計)、および総合計..

//Student Record Keeping System
class Sem1
{
    int a,b,c,S1T,S1GT;
    Sem1(int a,int b,int c)
    {
        this.a=a;
        this.b=b;
        this.c=c;
    }

    void total()
    {
        S1T=a+b+c;
        S1GT=S1T;
    }


    void display()
    {
        System.out.println("S11: "+a);
        System.out.println("S12: "+b);
        System.out.println("S13: "+c);
        System.out.println("S1Total: "+S1T);
        System.out.println("S1Gtotal: "+S1GT);
        System.out.println("");
    }

    }

class Sem2 extends Sem1
{
    int p,q,r,S2T,S2GT;
    Sem2(int p,int q,int r)
    {
        this.p=p;
        this.q=q;
        this.r=r;
    }

    void total()
    {   
        S2T=p+q+r;
        S2GT=S2T+S1T;
        }


    void display()
    {
        super.display();
        System.out.println("S21: "+p);
        System.out.println("S22: "+q);
        System.out.println("S23: "+r);
        System.out.println("S2Total: "+S2T);
        System.out.println("S2Gtotal: "+S2GT);
        System.out.println("");
    }

}

ここにメインクラスがあります

class StudentRcd
{
    public static void main(String abc[])
    {
        Sem1 obj = new Sem1(10,20,30);
        obj.total();
        obj.display();

        Sem2 obj1 = new Sem2(20,30,40);
        obj1.total();
        obj1.display();
    }
}

エラー: クラス Sem2 のコンストラクタ Sem2 は、指定された型に適用できません。{ ^ 必須: int,int,int が見つかりました: 引数がありません 理由: 実引数リストと仮引数リストの長さが異なります

ここで私を助けてください..

4

4 に答える 4

1

まず、コメントしたように、コンパイルの問題は、Sem1 に 0 引数/デフォルト コンストラクターがないため、Sem2 コンストラクターで Sem1 コンストラクターを呼び出さないことが原因です。super(p,q,r);Sem2 コンストラクターの最初の行として追加する必要があります。

第二に、さらに重要なことに、継承を間違って使用しているようです。Sem1 から継承する Sem2 オブジェクトを持つ理由はないようです。本質的に同一の Sem1 クラスと Sem2 クラスを使用する代わりに、単純に Semester オブジェクトの 2 つのインスタンスを使用できると思います。

実際、Sem2 を Sem1 のサブクラスとして持つと、Sem2 は Sem1 ではない ("is a" 関係がない) ため、継承の一般的なガイドラインに違反します。ただし、Sem1 と Sem2 は両方とも学期であるため、それぞれに固有のロジックが必要な場合は、Semester クラスを作成してから、Sem1 と Sem2 のサブクラスを作成できます。

于 2013-07-15T17:53:01.823 に答える
1

2 つの別々のクラスが本当に必要だとは思いません。2 つのクラスは、2 学期の合計の計算を除いて、ほとんど同じです。1 つのクラスの 2 つの個別のインスタンスを用意し、通年の合計を個別に計算する方が適切な場合があります。

継承によって関連付けられた 2 つのクラスが必要な場合、Sem1 には既定のコンストラクターがないため、Sem2 のコンストラクターで super() を呼び出す必要があります。セメスター 1 のマークはセメスター 2 のマークとは異なるため、Sem2 のコンストラクターに追加の値を指定する必要がある可能性があります。

class Sem2 extends Sem1
{
   int p,q,r,S2T,S2GT;
   Sem2( int a, int b, int c, int p,int q,int r)
   {
       super( a, b, c );
       this.p=p;
       this.q=q;
       this.r=r;
   }
于 2013-07-15T17:47:12.217 に答える
0

Sem2 は、スーパー コンストラクター super(int, int, int) を呼び出す必要があります。Sem2 は、さらに 3 つのグレードを取得するか、スーパー コンストラクターを呼び出すために使用できる SEM1 を取得する必要があります。

于 2013-07-15T17:47:34.230 に答える