在数组列表中打印出所有的对象

13
我需要能够打印出我的数组列表中的所有学生对象(包括所有变量)。这是否可行?当我尝试打印时,它输出这样的东西,例如student.Student@82701e。我认为这是十六进制或其他什么东西。
这是我的代码:
package student;

public class Student {

    private String studentName;
    private String studentNo;
    private String email;
    private int year;


    public Student() {
        this.studentName = null;
        this.studentNo = null;
        this.email = null;
        this.year = -1;
    }

    public Student(String nName, String nNum, String nEmail, int nYr) {
        this.studentName = nName;
        this.studentNo = nNum;
        this.email = nEmail;
        this.year = nYr;
    }

    public void setStudentName(String newStudentName) {
        this.studentName = newStudentName;
    }

    public void setStudentNo(String newStudentNo) {
        this.studentNo = newStudentNo;
    }

    public void setEmail(String newEmail) {
        this.email = newEmail;
    }

    public void setYear(int newYear) {
        this.year = newYear;
    }

    public String getStudentName() {
        return studentName;
    }

    public String getStudentNo() {
        return studentNo;
    }

    public String getEmail() {
        return email;
    }

    public int getYear() {
        return year;
    }
}

package student;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class studentTest {

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);



        List<Student> Students = new ArrayList();


        Student student1 = new Student();

        student1.setStudentName("Bob Marley");
        student1.setStudentNo("N0002");
        student1.setEmail("student2@student.com");
        student1.setYear(2);

        Students.add(student1);

        Student student2 = new Student();

        student2.setStudentName("Bill Harvey");
        student2.setStudentNo("N0003");
        student2.setEmail("student3@student.com");
        student2.setYear(2);

        Students.add(student2);

        Student student3 = new Student();

        student3.setStudentName("John Beans");
        student3.setStudentNo("N0004");
        student3.setEmail("student4@student.com");
        student3.setYear(2);

        Students.add(student3);


        System.out.println("Add new students: ");
        System.out.println("Enter number of students to add: ");
        int countStudents = input.nextInt();

        for (int i = 0; i < countStudents; i++) {
            Student newStudents = new Student();


            System.out.println("Enter details for student: " + (i + 1));

            System.out.println("Enter name: ");
            newStudents.setStudentName(input.next());

            System.out.println("Enter Number: ");
            newStudents.setStudentNo(input.next());System.out.println("Search by student number: ");



            System.out.println("Enter email: ");
            newStudents.setEmail(input.next());

            System.out.println("Enter year: ");
            newStudents.setYear(input.nextInt());
            Students.add(newStudents);
        }


    }
}

1
“[tag:homework]”标签已经过时。 - Travis J
3个回答

20

Student类中覆盖toString()方法,如下所示:

   @Override
   public String toString() {
        return ("StudentName:"+this.getStudentName()+
                    " Student No: "+ this.getStudentNo() +
                    " Email: "+ this.getEmail() +
                    " Year : " + this.getYear());
   }

16
每当你打印出类的任何实例时,都会调用Object类的defaulttoString方法,它返回你所得到的表示形式。它包含两个部分:- TypeHashCode
因此,在输出为student.Student@82701e的情况下:
  • student.StudentType,而
  • 82701eHashCode
因此,您需要在Student类中重写toString方法以获取所需的String representation:-
@Override
public String toString() {
    return "Student No: " + this.getStudentNo() + 
           ", Student Name: " + this.getStudentName();
}

当你从主类main中打印ArrayList时,它将为每个实例调用你重写toString方法,而不是Object类中的方法:

List<Student> students = new ArrayList();

// You can directly print your ArrayList
System.out.println(students); 

// Or, iterate through it to print each instance
for(Student student: students) {
    System.out.println(student);  // Will invoke overrided `toString()` method
}
在上述两种情况下,将调用在 Student 类中重写的 toString 方法,并打印每个实例的适当表示形式。

4

你需要在你的Student类中定义一个public String toString()方法。例如:

public String toString() {
  return "Student: " + studentName + ", " + studentNo;
}

1
如果您正在使用Eclipse,您可以通过点击“Source -> generate toString()”来自动生成。 - amit
这可能听起来有点傻 (抱歉,我还在学习) 但是如果我定义了那个方法,我怎样才能从中访问arraylist呢? - joe
1
@Rob 当你使用 System.out.println() 打印列表时,JVM 会自动调用列表中包含的对象的 toString() 方法。在你的情况下,这些对象将是 Student - Andrew Logvinov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接