面向对象编程-如何使用 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());
希望对您有所帮助,祝您好运!
作为我课程的一部分,我刚刚开始进行面向对象编程,但我正在努力解决这个问题,特别是 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());
希望对您有所帮助,祝您好运!