Почему выполняется метод 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 шт):
- ВАШ метод не сработает, пока ВЫ его явно не вызовете. Иначе бы при исполнении кода происходил бы кавардак и методы срабатывали бы, когда не надо. Поэтому если вы хотите, чтобы метод сработал, вызовете его:
alex.speak();
- Теперь про
toString(). Он вызывается, когда нужно объект представить в виде строки. Например, вы выводите объект на экран. В вашем случае он вызывается в этой строке:
String human = String.valueOf(alex);
Ведь вы с помощью метода String.valueOf() хотите представить объект в виде строки. Поэтому valueOf() дёргает toString() в классе Human.
Важно заметить, что toString() - особый метод, это один из методов класса Object, от которого наследуются все классы в языке java. Поэтому иногда его вызывают методы из стандартных java-библиотек. А о вашем методе speak() стандартные java-библиотеки ничего не знают. Потому что это ВАШ метод, а не переопределение метода из класса Object.
Ну и при создании объекта класса toString() конечно же НЕ вызывается. Потому что ЗАЧЕМ? ЗАЧЕМ при создании объекта получать его строковое представление? Совершенно незачем.