我是java的新手,并且在制作多级继承程序时遇到了很多问题。
我正在尝试创建一个程序,其中我的主类(AU)根据用户输入的内容分解为子类。
我的问题是当我尝试从我的第一级子类(学生)调用我的第二级(Part_Time_Student)子类时。
每当我尝试调用它时,它只会回忆起第一级子类(我当前所在的子类)。
我注意到,如果我使我的第二级子类(Part_Time_Student)扩展主超类(AU)它可以工作,但我更愿意让它扩展学生。
我意识到这是一篇非常复杂的帖子(特别是因为我不懂术语),但我希望我的代码很容易理解。
AU.java
public class AU {
Scanner input;
static String name;
static Long numb;
public AU() {
}
public void Name() {
input=new Scanner(System.in);
System.out.println("What is the member's name");
String nam = input.nextLine();
AU.name=nam;
System.out.println(nam +" has been added");
}
public void Phone() {
input=new Scanner(System.in);
System.out.println("What is the member's phone number");
Long number = input.nextLong();
AU.numb=number;
System.out.println(number+ " has been saved");
}
}
Main.java
public class Main {
private static Scanner input;
public static void main(String[] args) {
AU au = new AU();
au.Name();
au.Phone();
while (3==3) {
System.out.println("What is your role at the University?");
input=new Scanner(System.in);
String determ=input.nextLine();
if (determ.toUpperCase().equals("STUDENT")) {
Student student=new Student();
break;
}
else if (determ.toUpperCase().equals("STAFF")) {
break;
}
else if (determ.toUpperCase().equals("FACULTY")) {
break;
}
else if (determ.toUpperCase().equals("TESTER")) {
break;
}
else {
System.out.println("Invalid Response");
}
}
System.out.println("yay");
}}
Part_Time_Student.java
public class Part_Time_Student extends Student {
public Part_Time_Student() {
System.out.println("it switched");
System.out.println(GPA);
System.out.println(Assign);
System.out.println(name);
}
public void tester() {
System.out.println("test");
}
}
Student.java
public class Student extends AU {
static double GPA=5;
static String Assign;
public Student() {
super();
System.out.println(name);
System.out.println("Are you a full-time student or part- student(type part or full)");
input=new Scanner(System.in);
while (3==3) {
String get=input.nextLine();
switch (get.toUpperCase())
{
case "PART":{
Student.Assign="Part";
Part_Time_Student Studentp = new Part_Time_Student();
break;
}
case "FULL":{
Student.Assign="Full";
break;
}
default :{
System.out.println("Invalid ");
}}}
}
public void gpa(String grade,long credits) {
System.out.println(name+numb);
name=name;
}
public void Welcome() {
System.out.println("Welcome Student");
}
}
输出: 会员名称是什么
-Test
已添加测试
会员的电话号码是什么
-540
540已保存
你在大学的角色是什么?
- 学生
测试
您是全日制学生还是兼职学生(打字部分或全部)
-part
测试
您是全日制学生还是兼职学生(打字部分或全部)
如您所见,命令“Part_Time_Student Studentp = new Part_Time_Student();”只是回忆起过来的学生班。
答案 0 :(得分:1)
如果构造函数没有显式调用超类构造函数,Java编译器会自动插入对超类的无参数构造函数的调用。
https://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html
答案 1 :(得分:0)
将语句Part_Time_Student Studentp = new Part_Time_Student();
移出while循环,实际上是从构造函数中移出。
当你构造你的Student类时,当你调用子类的构造函数时,它会调用它的超类,即Student,所以它会一遍又一遍。所以它会一次又一次地问你同样的问题。
从以下位置删除Part_Time_Student
构造函数:
case "PART":{
Student.Assign="Part";
// Part_Time_Student Studentp = new Part_Time_Student(); //remove this
break;
}
将以下Main类中的此条件更改为:
if (determ.toUpperCase().equals("STUDENT"))
{
Student student=new Student();
if ( student.Assign.equalsIgnoreCase( "Part" ) )
{
Part_time_Student part_time_student = new Part_time_Student();
}
break;
}