面向对象编程-如何使用 toString() 方法和 format()?

Objected Oriented Programming- How to use the toString() method and format()?

作为我课程的一部分,我刚刚开始进行面向对象编程,但我正在努力解决这个问题,特别是 Person Class 中的 toString 方法。我需要写一个toString()方法来显示实例变量的内容。

我需要通过样本打印出来:

Person[forName=joe, surname= smith, age= 25, height= 1.57, gender= male]

我还需要使用格式化方法将其格式化为:

smith   joe   25   1.57   male
davis   sian  18   1.73   female
***     ***   ***  ***    ***

我还没有编写测试程序,但这是我到目前为止为 class 编写的内容,现在我被卡住了,我什至不确定我的 toString 语句是否有误。我为此使用 netBeans:

public class Person
{
  private String surname;   
  private String forname;   
  private int age;   
  private double height;           
  private String gender;

  public String toString()
  {
    return getClass().getName() + "[surname= " + surname + " forname= " + forname + " age= " + age + " height= " + height + " gender " + gender + "]";
  }
}

我需要做的是创建一个我可以测试的名为 Person 的 class。它需要能够为不同的人保存上面的五个变量(姓氏等)。我需要能够使用 toString() 方法打印出每个实例变量,并使用 format() 方法生成带有格式化信息的字符串,以便格式化 toString() 方法打印出的字符串就像第二个引文。

我是否在正确的轨道上,无论如何,我该如何解决这个问题?

编辑:我查看了 Person Class 并尽我所能,它看起来够体面吗?我将尝试一起获得一个 PersonTester。

public class Person
{ 
    private String surName;
    private String forName;
    private int age;
    private double height;
    private String gender;

@Override
public String toString()
{
    return getClass().getName() + "[surName= " + surName + " forName= " + forName + " age= " + age + " height= " + height + " gender " + gender + "]";
}

public void format()
{
    System.out.format("%10s%10s%10d%10f%10s", "surName", "forName", age, height, "gender");
}

public String getSurName()
{
    return surName;
}

public String getForName()
{
    return forName;
}

public int getAge()
{
    return age;
}

public double getHeight()
{
    return height;
}

public String getGender()
{
    return gender;
}

public void setSurName(String surName)
{
    this.surName = surName;
}

public void setForName(String forName)
{
    this.forName = surName;
}

public void setAge(int age)
{
    this.age = age;
}

public void setHeight(double height)
{
    this.height = height;
}

public void setGender(String height)
{
    this.gender = gender;
}

}

编辑 2:从 class 测试仪开始,但我 运行 再次陷入错误,因为 setter 没有 ;而不是声明。

到目前为止,这是测试人员:

public class PersonTester 
{
public static void main(String[] args)
{
    System.out.println("PersonClassTester");
    System.out.println("*****************");
    System.out.println("");

    Person joeSmith = new Person();
    String "smith" = joeSmith.setSurName();
    String "joe" = joeSmith.setForName();
    int 25 = joeSmith.setAge();
    double 1.57 = joeSmith.setHeight();
    String "male" = joeSmith.setGender();

    joeSmith.toString();
    joeSmith.format();
}
}

首先你必须注意到你创建的每个对象都扩展了 class 对象。此对象 class 包含方法,例如 toString、equals、hashCode... 你的对象也有这个方法(继承自对象)。例如,当您覆盖(您应该使用@Override 注释此方法)时。 toString 您将始终使用此 toString 方法而不是继承的方法。它称为多态性。您的 toString 方法看起来不错。在您的 main 方法中,您应该使用某种循环遍历所有 Persons 并在那里格式化 toString 方法的输出。 你的代码有错误 public String toString(); {

删除;在 ()

之后
public class Main {

    public static void main(String[] args) {

        Person a = new Person("smith", "joe", 25, 1.57, "male");
        Person b = new Person("davis", "sian", 18, 1.73, "female");

        List<Person> persons = new ArrayList<Person>();
        persons.add(a);
        persons.add(b);

        for(Person p : persons){    
            System.out.format("%s   %s   %s   %d   %.2f   %s", p.getClass().getName(), p.getSurname(), p.getForname(), p.getAge(), p.getHeight(), p.getGender());
            System.out.println();
        }   
    }
}

如果你调用这个

System.out.println(p.toString());

你会通过 toString 方法得到你的人。

我只是编辑你的 Person class 并添加构造函数和 geters + seters

public Person(String surname, String forname, int age, double height,
        String gender) {
    super();
    this.surname = surname;
    this.forname = forname;
    this.age = age;
    this.height = height;
    this.gender = gender;
}

这是 geter 和 seter 示例。

public String getSurname() {
        return surname;
    }

public void setSurname(String surname) {
        this.surname = surname;
    }

如前所述,您的 toString() 没问题。

请注意,在我看来,toString() 方法和 format() 方法应该独立工作,因为它们确实服务于不同的目的。

我建议不要把格式化方法放在人 class 中(或者至少让它成为静态方法)。这是因为单个 Person 实例没有足够的信息来以 table 格式打印。它至少需要知道列宽。否则你可能会得到这样的结果:

smith   joe   25   1.57   male
someVeryLongFirstName   sian  18   1.73   female
***     ***   ***  ***    ***

所以格式化方法应该先把需要打印的人员名单计算出来,然后再计算列宽。完成此操作后,您只需 pad 将 属性 值设置为列宽并打印出来。

你走在正确的轨道上:

在 Person 内部 class 您需要为每个私有变量添加 public 方法来设置数据:

public void setAge(int age) {
    this.age = age;
}

然后你可以在你的 main class 中创建一个 Person 对象并设置他的年龄:

public class Main {
    public static void main(String[] args) {
        Person p = new Person();
        p.setAge(15);
    }
}

作为替代方案,您可以在 Person class 中使用构造函数来设置对象的变量:

public Person(String surname, int age) {
    this.surname = surname;
    this.age = age;
}

然后像这样在 main 方法中创建对象:

Person p = new Person("Nillas", 25);

在创建对象并查看结果后,您始终可以 运行 主 class 中的 toString() 方法:

System.out.println(p.toString());

希望对您有所帮助,祝您好运!