我正在准备AP CS考试,在我的书的OOP部分偶然遇到了这个练习题。下面给出了两个类。
package chap4q9;
public class Person
{
private int age;
public Person(int a)
{
age = a;
}
public String toString()
{
return "Age: " + age + "\n";
}
}
package chap4q9;
public class Student extends Person
{
private double gpa;
public Student(int a, double g)
{
super(a);
gpa = g;
}
public String toString()
{
return super.toString() + "GPA: " + gpa; //This was where the missing code was
}
}下面是调用这两个类的客户端程序。
package chap4q9;
public class Chap4Q9
{
public static void main(String[] args)
{
Student kathy = new Student(17, 3.85);
System.out.println(kathy);
}
}最后,输出为:
年龄: 17岁
GPA: 3.85
如果你想知道,在输出中应该没有年龄和GPA之间的一条线,当我发布这篇文章的时候,这是一个奇怪的格式。
目标是替换第二个toString方法中缺少的代码(在上面的代码中,为缺少的代码插入了正确的答案,但我标记了位置)。我认为这本书是错的,但运行代码并得到相同的输出。我认为它只是打印凯西所在的内存位置,如果您想要获得该输出,则必须打印kathy.toString()。但是,仅仅打印kathy似乎就是在学生类中运行toString方法。我的问题是,为什么要打印学生对象,凯西,得到那个输出,而不只是一个内存位置。提前感谢所有的回复。
发布于 2011-10-04 22:56:22
这只是因为System.out.println在默认情况下会调用对象的toString()-method。在本例中,您已经在子类中实现了自己的toString,因此使用以下代码。
只有在Person和Student类中没有toString时,才会调用object类中的toString,它会打印一个对象标识字符串,该字符串由类名和对象hashCode的十六进制表示形式组成。
有关更多详细信息,请参阅对象类的javadoc:http://download.oracle.com/javase/6/docs/api/java/lang/Object.html#toString()
发布于 2011-10-04 22:56:58
默认情况下,println(Object)会调用String.valueOf(...)方法。看看:http://download.oracle.com/javase/1.4.2/docs/api/java/io/PrintStream.html#print(java.lang.Object和http://download.oracle.com/javase/1.4.2/docs/api/java/lang/String.html#valueOf(java.lang.Object
发布于 2015-04-29 00:04:44
我想在书中的某个地方,它说当做System.out.println时,如果有toString方法,它会自动调用。
https://stackoverflow.com/questions/7649761
复制相似问题