1

我正在尝试使用 super 和 this 关键字创建一个简单的 java 继承程序。此处显示学生在 2 个学期 sem1 和 sem2 的三个科目中的成绩。我想显示总分,即。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

首先,正如所评论的,您的编译问题是由于在 Sem2 构造函数中没有调用 Sem1 构造函数,因为 Sem1 没有 0 参数/默认构造函数。您需要添加super(p,q,r);为 Sem2 构造函数的第一行。

其次,更重要的是,您似乎错误地使用了继承。似乎没有理由让 Sem2 对象继承自 Sem1。我想你可以简单地拥有一个 Semester 对象的两个实例,而不是拥有基本相同的 Sem1 和 Sem2 类。

事实上,将 Sem2 作为 Sem1 的子类违反了继承的一般准则,因为 Sem2 不是 Sem1(不存在“是”关系)。但是,Sem1 和 Sem2 都是学期,因此如果每个学期都需要独特的逻辑,则可以有一个学期课程,然后是 Sem1 和 Sem2 子课程。

于 2013-07-15T17:53:01.823 回答
1

您忘记在 Sem2 中调用超类的构造函数。例如你应该有:

Sem2(int p,int q,int r)
{
    super(p,q,r);
    this.p=p;
    this.q=q;
    this.r=r;
}
于 2013-07-15T17:46:16.053 回答
1

我不认为你真的想要两个单独的课程。除了计算第 2 学期的总和外,这两个课程基本相同。拥有一个类的两个单独实例并分别计算全年总数可能会更好。

如果您确实想要两个通过继承相关的类,那么您要么需要在 Sem2 的构造函数中调用 super(),因为 Sem1 缺少默认构造函数。这可能需要您在 Sem2 的构造函数中提供额外的值,因为第 1 学期的分数与第 2 学期的分数不同。

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 要么需要再考三个等级,要么需要一个 SEM1,它可以用来调用超级构造函数。

于 2013-07-15T17:47:34.230 回答