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

时间:2015-02-05 12:28:57

标签: java oop format tostring

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

我需要打印样本:

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

我还需要使用format方法格式化它:

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

我还没有写过测试人员,但这是我到目前为止所写的课程,现在我被卡住了,我甚至不确定我是否得到了错误的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的类,我可以测试它。它需要能够为不同的人保留上面的五个变量(姓氏等)。我需要能够使用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:开始上课测试员,但我再次遇到有关安装者没有错误的错误;而不是一个声明。

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

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();
}
}

3 个答案:

答案 0 :(得分:0)

首先,您必须注意到您创建的每个对象都扩展了Object类。这个Object类包含像toString,equals,hashCode这样的方法...... 你的对象也有这个方法(继承自Object)。当你覆盖(你应该用@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类并添加构造函数和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;
    }

答案 1 :(得分:0)

如前所述,你的toString()很好。

请注意,toString()方法和format()方法是IMO应该独立工作,因为它们用于不同的目的。

我建议不要将格式方法放在person类中(或者至少使它成为静态方法)。这是因为单个Person实例没有足够的信息以表格格式打印。它至少需要知道列宽。否则你最终会得到这样的东西:

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

因此格式化方法应该列出应该打印出来的人员,然后首先计算列宽。完成此操作后,您只需将属性值pad添加到列宽并打印出来。

答案 2 :(得分:0)

你走在正确的轨道上:

在Person类的内部,您需要为每个私有变量添加公共方法以设置数据:

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

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

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

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

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

并在main方法中创建对象:

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

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

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

希望这有帮助,祝你好运!