Почему выполняется метод toString() в классе Human, но не выполняется speak()?

Взял код с JavaRush. Интересно, почему при создании объекта класса Human автоматически срабатывает toString(), а мой метод speak() — нет?

public class Main {
    public static void main(String[] args) {
        String a = String.valueOf(1);
        String b = String.valueOf(12.0D);
        String c = String.valueOf(123.4F);
        String d = String.valueOf(123456L);
        String s = String.valueOf(true);
        Human alex = new Human("Alex");
        String human = String.valueOf(alex);

        System.out.println(a);
        System.out.println(b);
        System.out.println(c);
        System.out.println(d);
        System.out.println(s);
        System.out.println(human);
        /*
        Вывод:
        1
        12.0
        123.4
        123456
        true
        Человек с именем Alex
         */
    }

    static class Human {
        private String name;

        public Human(String name) {
            this.name = name;
        }
        
        @Override
        public String toString() {
            return "Человек с именем " + name;
        }
        
        public void speak(){
            System.out.println("asdk;asd");
        }
    }
}

Ответы (1 шт):

Автор решения: Зонтик
  1. ВАШ метод не сработает, пока ВЫ его явно не вызовете. Иначе бы при исполнении кода происходил бы кавардак и методы срабатывали бы, когда не надо. Поэтому если вы хотите, чтобы метод сработал, вызовете его:
alex.speak();
  1. Теперь про toString(). Он вызывается, когда нужно объект представить в виде строки. Например, вы выводите объект на экран. В вашем случае он вызывается в этой строке:
String human = String.valueOf(alex);

Ведь вы с помощью метода String.valueOf() хотите представить объект в виде строки. Поэтому valueOf() дёргает toString() в классе Human.

Важно заметить, что toString() - особый метод, это один из методов класса Object, от которого наследуются все классы в языке java. Поэтому иногда его вызывают методы из стандартных java-библиотек. А о вашем методе speak() стандартные java-библиотеки ничего не знают. Потому что это ВАШ метод, а не переопределение метода из класса Object.

Ну и при создании объекта класса toString() конечно же НЕ вызывается. Потому что ЗАЧЕМ? ЗАЧЕМ при создании объекта получать его строковое представление? Совершенно незачем.

→ Ссылка