Java编码 - 继承问题

时间:2016-02-10 23:17:48

标签: java inheritance

我是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();”只是回忆起过来的学生班。

2 个答案:

答案 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;
}