为什么不显示子类数据成员的值?

时间:2016-09-29 11:48:19

标签: java inheritance

我创建了2个java文件:XCompanyShortlist.java和StudentDemo.java。 XCompanyShortlist.java包含主要方法和所有用户输入,如学生注册号,姓名,学期,GPA,CGPA,分支名称,安置状态和实习状态。

StudentDemo.java有一个超类StudentDemo初始化Reg。 No.,Name,Semester,GPA,CGPA使用参数化构造函数,它还包含一个显示所有信息的方法display()。

类BranchStudent扩展了StudentDemo类,并包含一个名为BranchName的额外String。该类还包含一个display()方法,该方法调用超类中的display()方法并打印BranchName。另一个类StudentPlacement包含InternshipStatus,PlacementStatus和首选公司列表数组的变量。

这是StudentDemo.java文件代码:

class StudentDemo {
    long RegNo;
    String fname;
    short sem;
    float gpa;
    float cgpa;

    StudentDemo() {
        RegNo = 0;
        fname = "";
        sem = 0;
        gpa = (float) 0.0;
        cgpa = (float)0.0;
    }
    StudentDemo(long RegNo, String fname, short sem, float gpa, float cgpa) {
        this.RegNo = RegNo;
        this.fname = fname;
        this.sem = sem;
        this.gpa = gpa;
        this.cgpa = cgpa;
    }
    StudentDemo(StudentDemo obj) {
        RegNo = obj.RegNo;
        fname = obj.fname;
        sem = obj.sem;
        gpa = obj.gpa;
        cgpa = obj.cgpa;
    }
    void display() {
        System.out.println("------------------------------------------");
        System.out.println("Registration No. :"+RegNo);
        System.out.println("Full Name: "+fname);
        System.out.println("Semester: "+sem);
        System.out.println("GPA: "+gpa);
        System.out.println("CGPA: "+cgpa);
        System.out.println("------------------------------------------");
    }
}
class BranchStudent extends StudentDemo {
    public String BranchName;
    BranchStudent(long RegNo,String fname,short sem,float gpa,float cgpa,String BranchName) {
        super(RegNo,fname,sem,gpa,cgpa);
        this.BranchName = BranchName;
    }
    BranchStudent() {
        super();
        BranchName = "CSE";
    }
    BranchStudent(BranchStudent obj) {
        super(obj);
        BranchName = obj.BranchName;
    }

    void display() {
        super.display();
        System.out.println("Student Branch: "+BranchName);
    }
}
class StudentPlacement extends BranchStudent {
    String compList[];
    int StatusPlacement, StatusIntern;

    StudentPlacement() {
        super();
        StatusPlacement = 0;
        StatusIntern = 0;
        compList = new String[3];
    }

    StudentPlacement(StudentPlacement obj) {
        super(obj);
        StatusPlacement = obj.StatusPlacement;
        StatusIntern = obj.StatusIntern;
        compList = obj.compList;
    }

    StudentPlacement(long RegNo, String fname, short sem, float gpa, float cgpa, String BranchName,String compList[], int StatusPlacement,int StatusIntern) {
        super(RegNo, fname, sem, gpa, cgpa, BranchName);
        this.compList = compList;
        this.StatusPlacement = StatusPlacement;
        this.StatusIntern = StatusIntern;
    }
}

这是XCompanyShortlist.java文件代码:

import java.util.Scanner;
public class XCompanyShortlist {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("Please Enter The Number Of Students: ");
        int n = sc.nextInt();

        StudentPlacement obj[] = new StudentPlacement[n];
        for(int i = 0; i < n; i++) {
            obj[i] = new StudentPlacement();
        }
        System.out.println("Please Enter The Student Details: ");
        for(int i = 0; i < n; i++) {
            System.out.print("Please Enter The Reg. No. :");
            long RegNo = sc.nextLong();
            sc.nextLine();
            System.out.print("Please Enter The Full Name: ");
            String fname = sc.nextLine();
            System.out.print("Please Enter The Semester: ");
            short sem = sc.nextShort();
            System.out.print("Please Enter The GPA: ");
            float gpa = sc.nextFloat();
            System.out.print("Please Enter The CGPA: ");
            float cgpa = sc.nextFloat();
            System.out.print("Please Enter Branch Name:");
            String branchName = sc.nextLine();
            sc.nextLine();
            System.out.println("Please Enter 3 Preferred Choice: ");
            String compList[] = new String[3];
            for(int x = 0; x < 3; x++) {
                compList[x] = sc.nextLine();
            }
            System.out.print("Please Enter The Status Of Placement(0/1): ");
            int statusPlacement = sc.nextInt();
            System.out.print("Please Enter Status Of Internship(0/1): ");
            int statusIntern = sc.nextInt();
            obj[i] = new StudentPlacement(RegNo,fname,sem,gpa,cgpa,branchName,compList,statusPlacement,statusIntern);
            System.out.println();
        }
        for(int i = 0; i < n; i++) {
            obj[i].display();
        }
        sc.close();
    }

}

我面临的问题是StudentDemo超类中的所有学生详细信息都被显示,但子类BranchStudent没有打印BranchName。我无法在代码中找到问题。

输出:

Please Enter The Number Of Students: 
1
Please Enter The Student Details: 
Please Enter The Reg. No. :159101046
Please Enter The Full Name: Bitan Basak
Please Enter The Semester: 3
Please Enter The GPA: 8.86
Please Enter The CGPA: 8.64
Please Enter Branch Name:CSE
Please Enter 3 Preferred Choice: 
HP
Dell
Microsoft
Please Enter The Status Of Placement(0/1): 0
Please Enter Status Of Internship(0/1): 0

------------------------------------------
Registration No. :159101046
Full Name: Bitan Basak
Semester: 3
GPA: 8.86
CGPA: 8.64
------------------------------------------
Student Branch: 

这是我的程序给出的输出。如您所见,学生分部未被打印。我无法理解为什么。

2 个答案:

答案 0 :(得分:3)

据我所知,这个问题与继承无关,而是你向构造函数提供一个空行。

这意味着使用Scanner.nextLine()方法有问题。如果我将您的代码更改为:

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("Please Enter The Number Of Students: ");
        int n = sc.nextInt();

        StudentPlacement obj[] = new StudentPlacement[n];
        for(int i = 0; i < n; i++) {
            obj[i] = new StudentPlacement();
        }
        System.out.println("Please Enter The Student Details: ");
        for(int i = 0; i < n; i++) {
            System.out.print("Please Enter The Reg. No. :");
            long RegNo = sc.nextLong();
            sc.nextLine();
            System.out.print("Please Enter The Full Name: ");
            String fname = sc.nextLine();
            System.out.print("Please Enter The Semester: ");
            short sem = sc.nextShort();
            System.out.print("Please Enter The GPA: ");
            float gpa = sc.nextFloat();
            System.out.print("Please Enter The CGPA: ");
            float cgpa = sc.nextFloat();
            sc.nextLine();
            System.out.print("Please Enter Branch Name:");
            String branchName = sc.nextLine();
            System.out.println("Please Enter 3 Preferred Choice: ");
            String compList[] = new String[3];
            for(int x = 0; x < 3; x++) {
                compList[x] = sc.nextLine();
            }
            System.out.print("Please Enter The Status Of Placement(0/1): ");
            int statusPlacement = sc.nextInt();
            System.out.print("Please Enter Status Of Internship(0/1): ");
            int statusIntern = sc.nextInt();
            obj[i] = new StudentPlacement(RegNo,fname,sem,gpa,cgpa,branchName,compList,statusPlacement,statusIntern);
            System.out.println();
        }
        for(int i = 0; i < n; i++) {
            obj[i].display();
        }
        sc.close();
    }

即。在分支名称输入之前移动sc.nextLine(),扫描程序从控制台中选择正确的值。

希望有所帮助。

问候

答案 1 :(得分:0)

在void display()方法中你调用super display()方法,所以super display()方法调用的不是分支显示方法而是添加this.branchname