我正在攻读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
万一你想知道,输出中Age和GPA之间实际上不应该是一条线,当我发布这个时,这是一个奇怪的格式化。
目标是在第二个toString方法中替换丢失的代码(在上面的代码中,为丢失的代码插入了正确的答案,但我标记了位置)。我认为这本书是错的,但运行代码并得到相同的输出。我认为它只会打印kathy所在的内存位置,如果你想得到那个输出,你必须打印kathy.toString()。但是,只是打印kathy似乎在Student类中运行toString方法。我的问题是,为什么打印Student对象,kathy,获取输出,而不仅仅是内存位置。 提前感谢所有回复。
答案 0 :(得分:2)
那就是因为System.out.println默认调用toString() - 对象的方法。在您的情况下,您已在子类中实现了自己的toString,因此使用它。
只有在Person和Student类中没有toString时,才会调用Object-class中的toString,它会打印一个对象标识字符串,该字符串由类名和十六进制表示组成对象的hashCode。
有关详细信息,请参阅Object类的javadoc:http://download.oracle.com/javase/6/docs/api/java/lang/Object.html#toString()
答案 1 :(得分:0)
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)
答案 2 :(得分:0)
我认为在本书的某个地方,它说当做System.out.println时,它会自动调用toString方法(如果有的话)。
答案 3 :(得分:-1)
你在两个类中都覆盖了toString() - 为什么你认为会调用标准的Object toString()方法呢?