我正在尝试创建一个简单的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 发现:没有争论 原因:实际和正式的参数列表长度不同
请帮助我...
答案 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来调用超级构造函数。