ООП AP CS Практика - PullRequest
       29

ООП AP CS Практика

1 голос
/ 04 октября 2011

Я готовлюсь к экзамену AP CS и столкнулся с этой проблемой практики в разделе ООП моей книги.Даны следующие два класса.

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

ГПД: 3,85

На случай, если вам интересно, на самом деле не должно быть линии между возрастом и ГПД в выходных данных, что было странным форматированием, когдаЯ написал это.

Цель состояла в том, чтобы заменить отсутствующий код во втором методе toString (в приведенном выше коде был добавлен правильный ответ для отсутствующего кода, но я отметил местоположение).Я думал, что книга была неправильной, но запустил код и получил тот же результат.Я думал, что это просто напечатает ячейку памяти, в которой находилась Кэти, и если вы хотите получить этот вывод, вы должны будете напечатать kathy.toString ().Тем не менее, просто печатание Кэти, кажется, запускает метод toString в классе Student.Мой вопрос заключается в том, почему печатается объект Student, Кэти, получается этот вывод, а не просто место в памяти.Заранее спасибо за все ответы.

Ответы [ 4 ]

2 голосов
/ 04 октября 2011

Ну, это только потому, что System.out.println по умолчанию вызывает метод toString () - объекта. В вашем случае вы реализовали свой собственный toString в дочернем классе, так что это используется.

Только если у вас не будет toString в вашем Person и в вашем классе Student, будет вызываться toString из класса Object, который печатает строку идентификации объекта, которая состоит из имени класса и шестнадцатеричного представления hashCode объекта.

См. Javadoc для Object-класса для более подробной информации: http://download.oracle.com/javase/6/docs/api/java/lang/Object.html#toString()

0 голосов
/ 28 апреля 2015

Я думаю, что где-то в книге говорится, что при выполнении System.out.println он автоматически вызывает метод toString, если он есть.

0 голосов
/ 04 октября 2011

Вы переопределили toString () в обоих классах - с какой стати вы думаете, что будет вызван стандартный метод Object toString ()?

0 голосов
/ 04 октября 2011

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)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...