Как поддерживать println в классе?

Что мой собственный класс должен поддерживать, чтобы println() печатал его? Например, у меня есть

public class A {
...
}

Какие методы должен выполнять класс "A", чтобы этот код работал:

public static void main() {
    A a = new A();
    System.out.println(a);
}

У меня есть предположение, что метод toString должен быть перегружен. Я прав? Достаточно ли этого?

Ответ 1

Вы можете распечатать любой объект, используя System.out.println(Object). Эта перегруженная версия println распечатает toString представление вашего объекта. Если вы хотите настроить то, что будет распечатано, вы должны переопределить метод Object#toString(), например:

public class A {
    private String foo;

    @Override
    public String toString() {
        // When you print out instance of A, value of its foo
        // field will be printed out
        return foo;
    }
}

Если вы не переопределите метод Object#toString(), будет использоваться реализация по умолчанию из класса Object, которая имеет эту форму (имя класса и шестнадцатеричное представление хеш-кода экземпляра):

public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

Бонус:, если вам нужно создать реализацию toString() из нескольких полей, есть инструменты, облегчающие ее. Например, ToStringBuilder от Commons Lang. Или некоторые Java-IDE, такие как IntelliJ IDEA, даже предлагают генерировать toString для вас на основе полей класса.

Ответ 2

Для этого вам необходимо переопределить toString():

public class A {
    @Override
    public String toString() {
        return "A";
    }
}

Метод возвращает строковое представление объекта. В общем случае метод toString возвращает строку, которая "текстово представляет" этот объект.

Ответ 3

Вам нужно реализовать метод toString(). Все, что вы вернетесь из него, будет напечатано.