【问题标题】:Class Constructor Objects don't display correctly类构造函数对象无法正确显示
【发布时间】:2013-10-01 02:29:28
【问题描述】:

如果你想知道我的程序的目的是什么,你可以查看我之前的问题。这是我几乎完成的代码:

import javax.swing.JOptionPane;

public class AssignmentTen
{
    public static void main (String[] args)
    {
        System.out.println();
        int num = Integer.parseInt(args[0]);
        int eNumber;
        String input2;
        String input3;
        String input4;
        String input5;
        String input6;
        int input7;
        int input8;
        int input9;
        int input10;

        Employee[] employees = new Employee[num];
        for (int i = 0; i < num; i++)
        {
            eNumber = getInt ("Enter Employee Number:");
            input2 = getString ("Enter Employee First Name:");
            input3 = getString ("Enter Employee Last Name:");
            input4 = getString ("Enter Employee Street:");
            input5 = getString ("Enter Employee City:");
            input6 = getString ("Enter Employee State (Initials):");
            input7 = getInt ("Enter Employee Zip Code (5 Digits):");
            input8 = getInt ("Enter Employee Hire Month (MM):");
            input9 = getInt ("Enter Employee Hire Day (DD):");
            input10 = getInt ("Enter Employee Hire Year(YYYY):");

            Name name = new Name(input2, input3);
            Address address = new Address (input4, input5, input6, input7);
            Date hireDate = new Date (input8, input9, input10);
            employees[i] = new Employee (eNumber, name, address, hireDate);

            System.out.println("#" + employees[i].empNumber + "\n" + employees[i].empName + "\n" + employees[i].empAddress + "\nHire Date: " + employees[i].empHireDate + "\n\n");
        }
    }

    public static int getInt(String paramString)
    {
        String str = JOptionPane.showInputDialog(paramString);
        return Integer.parseInt(str);
    }

    public static String getString(String paramString)
    {
        String str = JOptionPane.showInputDialog(paramString);
        return str;
    }
}

class Employee
{
    Number empNumber;
    Name empName;
    Address empAddress;
    Date empHireDate;

    public Employee(Number empNumber, Name empName, Address empAddress, Date empHireDate)
    {
        this.empNumber = empNumber;
        this.empName = empName;
        this.empAddress = empAddress;
        this.empHireDate = empHireDate;
    }
}

class Name
{
    String firstName;
    String lastName;

    Name(String first, String last)
    {
        firstName = first;
        lastName = last;
    }
}

class Address
{
    String eStreet;
    String eCity;
    String eState;
    int eZipCode;

    Address(String street, String city, String state, int zipCode)
    {
        eStreet = street;
        eCity = city;
        eState = state;
        eZipCode = zipCode;
    }
}

class Date
{
    int month;
    int day;
    int year;

    Date(int eMonth, int eDay, int eYear)
    {
        month = eMonth;
        day = eDay;
        year = eYear;
    }
}

我希望我的程序显示通过命令行指定的员工数量的信息(例如,我键入“java AssignmentTen 3”来记录三个不同员工对象的数据)。我希望信息显示如下:

[#]员工编号

名字姓氏

街道城市州首字母邮政编码

入职日期:MM DD YYYY

例如:

#123

约翰·史密斯

123 示例街 CA 12345

入职日期:2013 年 9 月 30 日

但是,最终显示的内容根本不正确。员工编号显示正常,但名称行显示为“姓名@[RandomCharacters]”,地址行显示为“地址@[RandomCharacters]”,雇用日期行显示为“雇用日期:日期@[随机字符]”。我怎样才能让它以我想要的方式显示(包括单词之间的空格和分隔月、日和年的斜线)?

谢谢。

编辑:我添加了接受的答案建议的更改,但我仍然遇到日期行的问题。我使用了这段代码:

class Date
{
    int month;
    int day;
    int year;

    Date(int eMonth, int eDay, int eYear)
    {
        month = eMonth;
        day = eDay;
        year = eYear;
    }

    public String toString()
    {
        return month + "/" + day + "/" + year;
    }
}

但它仍然想出随机字符。

【问题讨论】:

  • 而不是要求用户将 MM DD YYYY 作为 3 个不同的字段?为什么不要求他们将其作为单个字段(例如 DDMMYYYY)?稍后您可以使用 SimpleDateFormat 轻松显示它吗?

标签: java class object command-line constructor


【解决方案1】:

您看到的字符是您的类从Object 类继承的未覆盖toString() 方法的结果(因为所有类都从Object 扩展)。您需要实现您的自定义 toString() 方法来为每个类返回您想要的格式。例如,

class Name
{
    String firstName;
    String lastName;

    Name(String first, String last)
    {
        firstName = first;
        lastName = last;
    }

    public String toString() 
    {
        return "[firstName = " + firstName + ", lastName = " + lastName + "]";
    }
}

那你就可以了

Name name = new Name("John", "Doe");
System.out.println(name);

会打印

[firstName = John, lastName = Doe]

【讨论】:

  • 这适用于名称和地址类,但不适用于 HireDate 类。我写了this,但它仍然会出现随机字符。是不是我做错了什么?
  • @user2709168 不要将代码放在 cmets 中,它的格式不好。你可以编辑你的问题,我来看看。
【解决方案2】:

您需要为NameAddressDate 中的每一个编写一个toString 方法。当您尝试打印任何对象时,这就是在幕后调用的内容。这是toString 方法对于Date 类的样子。自己动手做另外两个吧。

public String toString() {
    return month + "/" + day + "/" + year;
}

您可能会发现阅读http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#toString() 很有用。

【讨论】:

    【解决方案3】:

    您添加到员工的姓名、地址和日期变量是具有自己变量的对象。覆盖 toString() 以打印出每个变量或通过 employees[i].name.firstname 手动调用它们。

    @Override
    public String toString(){
        return firstName + lastName;
    }
    

    您还应该使用带有 getter 和 setter 访问方法的私有变量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-08
      • 2015-07-21
      • 2012-01-20
      • 1970-01-01
      • 1970-01-01
      • 2021-11-24
      相关资源
      最近更新 更多