【问题标题】:toString() only printing default valuestoString() 只打印默认值
【发布时间】:2013-11-06 13:52:43
【问题描述】:

我正在尝试使用 toString() 方法来打印一些私有字段。但是,每当我尝试将适当类的对象发送到打印方法时,它只会打印出每个字段的默认值,无论我将它们更改为什么。任何帮助将不胜感激:) 这是带有 toString() 方法的类(它还覆盖了另一个类,它是 getter 的来源)。对不起,我编辑这篇文章的速度很慢。不熟悉这里的文本编辑器。

人物类

public class Person
{
// Declare all the fields as strings
private String firstName = "", lastName = "", address = "", zipcode = "",
        phone = "";  // There are accessors and mutators for these as well
public String toString()
{
        String str = "First name: " + firstName + "...Last name: " + lastName + 
                "... Street address: " + address + "... Zipcode: " + zipcode + 
                "... Phone number: " + phone;

    return str;
}

学生班

  public class Student extends Person
  {
    // declare fields that are not in Person
    private String major = "";
    private double gpa;

        // Declare accessor and mutator methods for the fields
        public String getMajor()
        {
            return major;
        }

    public void setMajor(String major)
    {
        this.major = major;
    }

    public double getGpa()
    {
        return gpa;
    }

    public void setGpa(double gpa)
    {
        this.gpa = gpa;
    }


    // Create a toString method that overrides the one in Person
    public String toString()
    {
        String str = "First name: " + getFirstName() + "...Last name: " + 
                getLastName() + "... Street address: " + getAddress() + 
                "... Zipcode: " + getZipcode() + "... Phone number: " +
                getPhone() + "... Grade point average: " + getGpa() +
                "...Major: " + getMajor();

        return str;
    }
}

这是整个主课......其中很多都是乏味的代码,因为它是家庭作业,但主要思想是: “编写一个名为 CollegeList 的应用程序,声明一个包含 4 个“常规”CollegeEmployees、3 个教员和 7 个学生的数组。提示用户指定将输入哪种类型的人员数据('C'、'F' 或 'S' ),或允许用户退出 ('Q')。当用户选择继续(即不退出)时,接受适当类型人员的数据输入。如果用户尝试输入数据超过 4 名大学员工、3 名教职员工或 7 名学生显示错误消息。当用户退出时,在屏幕上显示一个报告,在适当的标题“学院员工”、“教师”或“学生”下列出每组人员。如果用户在会话期间没有为一种或多种类型的人输入数据,请在适当的标题下显示适当的消息。

主类

import java.util.Scanner;  // Needed for Scanner class

public class CollegeList
{

/**
 * @param args the command line arguments
 */
public static void main(String[] args)
{
    // Declare the arrays of people
    Person[] people = new Person[14];

    // These three arrays are being made to print out the types of people
    // at the end neatly
    Faculty[] fArray = new Faculty[4];
    Student[] sArray = new Student[7];
    CollegeEmployee[] cArray = new CollegeEmployee[3];

    // Prompt for users input
    System.out.print("Please choose the type of person you are entering " +
            "data for.\nFor a student enter \"S\"; for a faculty member " +
            "enter \"F\"; for a college employee enter \"C\"; and to quit " 
            + "enter \"Q\": ");

    Scanner keyboard = new Scanner(System.in);
    String type = keyboard.next();  // the type of person
    System.out.println();

    // initialize counts of persons so that user does not enter more
    int facultyCount = 0;
    int studentCount = 0;
    int employeeCount = 0;

    // initialize index of the array to 0
    int index = 0;

    // continue until the user enters Q or until one of the types of people
    // overflows or until all 14 elements are taken up
    while (!type.equals("Q") && (facultyCount <= 3) && (studentCount <= 7)
            && (employeeCount <= 4) && (index < 14))
    {
        if(type.equals("S") && !type.equals("Q")) // Enter info for student
        {
            // Give the indexes the adresses
            people[index] = new Student();
            sArray[studentCount] = new Student();

            // Set the info
            personInfo(people[index]);
            studentInfo((Student)people[index]);
            System.out.println("\n");

            // Increment the counts
            studentCount++;
            index++;
        }

        else if(type.equals("C") && !type.equals("Q")) // Enter info for
        {                                              // college employee
            // Give the indexes the adresses
            people[index] = new CollegeEmployee();
            cArray[employeeCount] = new CollegeEmployee();

            // Set the info
            personInfo(people[index]);
            employeeInfo((CollegeEmployee)people[index]);
            System.out.println("\n");

            // Increment the counts
            employeeCount++;
            index++;
        }

        else if(type.equals("F") && !type.equals("Q")) // enter info for faculty
        {
            // Give the indexes the adresses
            people[index] = new Faculty();
            fArray[facultyCount] = new Faculty();

            // Set the info
            personInfo(people[index]);
            employeeInfo((CollegeEmployee)people[index]);
            facultyInfo((Faculty)people[index]);
            System.out.println("\n");

            // increment the counts
            facultyCount++;
            index++;
        }

        System.out.print("Please enter the next person type (S, C, F, " +
                "or Q): ");
        type = keyboard.next();
    }

    // Displays error message then closes program if there was overflow
    if ((facultyCount > 3) || (studentCount > 7) || (employeeCount > 4))
    {
        System.out.println("Too much data for one type of  person. Goodbye.");
        System.exit(0);
    }


    // Print the data for all of the college employees
    System.out.println("\n\n");
    System.out.println("THE COLLEGE EMPLOYEES");
    for (int i = 0; i < employeeCount; i++)
    {
        System.out.println(cArray[i]);
        System.out.println("\n");
    }
    // Determines if not all of the personS type was filled
    if (employeeCount != 4)
    {
        System.out.println("There are " + (4 - employeeCount) + " employees"
                + " who are not recorded.");
    }



    // Print the data for all of the faculty
    System.out.println("\n\n");
    System.out.println("THE FACULTY");
    for (int i = 0; i < facultyCount; i++)
    {
        System.out.println(fArray[i]);
        System.out.println("\n");
    }
    // Determines if not all of the person type was filled
    if (facultyCount != 3)
    {
        System.out.println("There are " + (3 - facultyCount) + " faculty "
                + "members who are not recorded.");
    }



    // Print the data for all of the students
    System.out.println("\n\n");
    System.out.println("THE STUDENTS");
    for (int i = 0; i < studentCount; i++)
    {
        System.out.println(sArray[i]);
        System.out.println("\n");
    }
    // Determines if not all of the person type was filled
    if (studentCount != 7)
    {
        System.out.println("There are " + (7 - studentCount) + " students "
                + "who are not recorded.");
    }
}

// prompts the user for data input that is universal to all the people
public static void personInfo(Person p)
{
    Scanner keyboard = new Scanner(System.in);

    System.out.print("First name: ");
    String fName = keyboard.nextLine();
    System.out.println();

    System.out.print("Last name: ");
    String lName = keyboard.nextLine();
    System.out.println();

    System.out.print("Street address: ");
    String address = keyboard.nextLine();
    System.out.println();

    System.out.print("Zipcode: ");
    String zipcode = keyboard.nextLine();
    System.out.println();

    System.out.print("Phone number: ");
    String phone = keyboard.nextLine();
    System.out.println();

    // Sets the data accordingly
    p.setFirstName(fName);
    p.setLastName(lName);
    p.setAddress(address);
    p.setZipcode(zipcode);
    p.setPhone(phone);
}

// Sets the data for student fields
public static void studentInfo(Student s)
{
    Scanner keyboard = new Scanner(System.in);

    System.out.print("Grade point average: ");
    double gpa = keyboard.nextDouble();
    System.out.println();

    System.out.print("Major: ");
    String major = keyboard.next();
    System.out.println();

    // Set the data accordingly
    s.setGpa(gpa);
    s.setMajor(major);
}

// Sets the data for Faculty fields
public static void facultyInfo(Faculty f)
{
    Scanner keyboard = new Scanner(System.in);

    System.out.println("Is the faculty tenured (\"yes\" or \"no)\"?");
    String tenured = keyboard.next();

    // set the data accordingly
    switch (tenured)
    {
        case "yes" :
            f.setTenured(true);
            break;
        case "no" :
            f.setTenured(false);
            break;
    }
}

// Sets the info for CollegeEmployee fields
public static void employeeInfo(CollegeEmployee c)
{
    Scanner keyboard = new Scanner(System.in);

    System.out.print("Social security number: ");
    String socialSecurity = keyboard.next();
    System.out.println();

    System.out.print("Salary: ");
    String salary = keyboard.next();
    System.out.println();

    System.out.print("Department name: ");
    String department = keyboard.next();
    System.out.println();

    // Set the data accordingly
    c.setSocialSecurity(socialSecurity);
    c.setSalary(salary);
    c.setDepartment(department);
}

}

【问题讨论】:

  • 你能在你实现toString的地方添加代码
  • 你能提供一个完整的例子吗?向我们展示Person 类以及您创建Student 并打印它的方式。
  • 提供一些输出值的例子...
  • 你能在屏幕上显示正在打印的内容吗?
  • @Dodd10x 数组中每个学生对象的输出是: 名字: ...姓氏: ... 街道地址: ... 邮政编码: ... 电话号码: ...平均绩点:0.0 ...专业:

标签: java tostring


【解决方案1】:

您正在为每个条目创建两个 Student() 实例。您只更新了 people 数组中的那个,而不是 student 数组。

   people[index] = new Student();
   sArray[studentCount] = new Student();

假设您确实想将学生存储在两个数组中,请将其更改为:

Student student = new Student();
people[index] = student;
sArray[studentCount] = student;

【讨论】:

    【解决方案2】:

    由于我没有你的 Person 类实现,我只是忽略了 Person 类。这是我的代码:

    public class Student
    {
        // declare fields that are not in Person
        private String major = "";
        private double gpa;
    
        // Declare accessor and mutator methods for the fields
        public String getMajor()
        {
            return major;
        }
    
        public void setMajor(String major)
        {
            this.major = major;
        }
    
        public double getGpa()
        {
            return gpa;
        }
    
        public void setGpa(double gpa)
        {
            this.gpa = gpa;
        }
    
    
        // Create a toString method that overrides the one in Person
        public String toString()
        {
            String str = "Grade point average: " + getGpa() +
                    "...Major: " + getMajor();
    
            return str;
        }
        public static void main(String [] args)
        {
            Student s = new Student();
            s.setGpa(8.88);
            s.setMajor("CS");
            System.out.println(s);
        }
    }
    

    这是输出:

    平均绩点:8.88...专业:CS

    可能你在打印之前没有设置对象的字段。

    【讨论】:

      【解决方案3】:

      您可以添加一个包含所有字段的构造函数

      public class Person {
      
          private String firstName = "";
          private String lastName = "";
          private String address = "";
          private String zipcode = "";
          private String phone = "";
      
          public Person(String firstName,
                        String lastName,
                        String address,
                        String zipcode,
                        String phone) {
      
              this. firstName = firstName;
              this.lastName = lastName;
              this.address = address;
              this.zipcose = zipcode;
              this.phone = phone;
      
          }
      }
      

      main

      public static void main(String[] args){
          Person person = new Person(
                 "John", "Smith", "444 Some Lame St", "90210", "510-555-5555");
      
          System.out.println(person);
      }
      

      【讨论】:

        【解决方案4】:

        我认为您不应该在 Student 中调用 Person 的 getter 来执行 toString,而应该执行以下操作:

        return super.toString() + "... Grade Point Average: " + this.gpa +Student 不必知道Person 想要显示为字符串的信息。它应该只返回 Person 想要显示的任何内容以及 Student 想要显示的任何内容。

        话虽如此,我同意其他答案,即您实际上并未在Student 中设置任何内容。能否请您发布您的主要方法?

        编辑:现在您已经发布了您的主要方法,我可以看到您的问题。您插入到people 数组中的Person 与您插入到c/s/fArray 中的对象不同。因此,当您打印 c/s/fArray 时,您实际上是在打印未初始化的对象。如果您想保留对象的副本,您应该执行以下操作:

        people[index] = new Faculty();
        fArray[facultyCount] = people[index];
        

        那么people[index]fArray[facultyCount] 都是一样的。

        同样,您不应该使用静态方法来初始化对象,而应该在这些对象的构造函数中这样做。

        【讨论】:

        • 它甚至没有打印出 Person 的 toString。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多