OOP AP CS实践

时间:2011-10-04 14:49:12

标签: java oop computer-science

我正在攻读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,获取输出,而不仅仅是内存位置。 提前感谢所有回复。

4 个答案:

答案 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)

答案 2 :(得分:0)

我认为在本书的某个地方,它说当做System.out.println时,它会自动调用toString方法(如果有的话)。

答案 3 :(得分:-1)

你在两个类中都覆盖了toString() - 为什么你认为会调用标准的Object toString()方法呢?