使用super继承Java继承

时间:2013-07-15 17:41:55

标签: java inheritance

我正在尝试创建一个简单的java继承程序以及使用super和this关键字。在这里显示学生在三个科目中的标记为2个学期sem1和sem2。 我想显示总分,即。 S1T(总共Sem1),S2T(总共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不能应用于给定的类型;     {     ^   required:int,int,int   发现:没有争论   原因:实际和正式的参数列表长度不同

请帮助我...

4 个答案:

答案 0 :(得分:1)

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

Sem2(int p,int q,int r)
{
    super(p,q,r);
    this.p=p;
    this.q=q;
    this.r=r;
}

答案 1 :(得分:1)

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

如果你想要想要通过继承相关的两个类,那么你需要在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;
   }

答案 2 :(得分:1)

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

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

事实上,将Sem2作为Sem1的子类打破了继承的一般准则,因为Sem2不是Sem1(没有“是”关系)。 Sem1和Sem2都是学期,所以你可以有一个Semester类,然后是Sem1和Sem2子类,如果每个都需要独特的逻辑。

答案 3 :(得分:0)

Sem2需要调用超级构造函数super(int,int,int)。 Sem2要么需要再增加三个等级,要么用SEM1来调用超级构造函数。