task05.task0525 - И целой утки мало
я решил задачу но в недоумении
почему метод toString работает как конструктор
ведь он сразу при создании обьекта возвращает обьекту свою строку из toString
вызов
System.out.println(dog1); //здесь он должен вывести то что в конструкторе который без параметров а он почему то выводит то что в методе toString
System.out.println(dog2.toString()); //здесь мне понятно вызываем метод тустринг обьекта дог
victor
19 уровень
почему метод работает как конструктор
Решен
Комментарии (8)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
hidden #598481
10 декабря 2018, 18:32
Ты пишешь:
System.out.println(dog1);
Метод println() для произвольного объекта выглядит так:
public void println(Object x) {
String s = String.valueOf(x);
synchronized (this) {
print(s);
newLine();
}
}
Метод String.valueOf(x):
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
То есть внутри System.out.println() так или иначе сокрыт вызов метода toString(). У тебя же для твоих классов Dog и Cat метод toString() переопределен, то есть вместо стандартного используется метод, написанный тобой.
Можешь в порядке эксперимента в методе toString вместо своего вывода System.out.println("Dog"); написать super.toString(), что вызовет toString класса Object, т.к. Object является родителем всех классов, в т.ч. и твоих.
Тогда у тебя вместо слова Dog выведется конструкция из полного имени класса и хэшкода твоего объекта, т.к. это и есть стандартная реализация toString():
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
То же самое получится, если совсем удалить методы toString() из своих классов, и просто напечатать объекты.
Такой принцип очень удобен тем, что у многих классов из стандартных библиотек Java метод toString уже переопределен, чтобы например можно было выводить в консоль не только содержимое коллекций, но и коллекции целиком: массивы, списки и т.д. не по одному элементу, а в строку целиком.
+3
victor
10 декабря 2018, 19:52
спс.хрошо и доступно обесняете
теперь есть немного понимания
0
Евгений Калинов
10 декабря 2018, 13:06
Данная задача демонстрирует пример того как можно переопределять метод toString(), который наследуется от класса Object всеми классами, он не работает как конструктор и в приведенных тобой примерах в случае System.out.println(dog1); метод toString(); вызывается неявно, а в случае System.out.println(dog2.toString()); явно, т.е. это одно и тоже
+1
victor
10 декабря 2018, 13:52
спс за ответ
но все равно чувство такое что до конца не догоняю
0
Евгений Калинов
10 декабря 2018, 15:31
Прочитай Head First Java, для начала идеальная книга, материал подан крайне доступно и увлекательно
+1
victor
10 декабря 2018, 18:06
ок
возьму под прицелом
0
vinslerExpert
10 декабря 2018, 12:16
Давно не тестил, но тут он вообще должен вывести ссылку на память в которой лежит объект, но никак не toString();
И вообще не понятно про какую задачу идет речь, название по уровням никто искать не будет, нужно указывать хотя бы task.
0
victor
10 декабря 2018, 13:46
смотри внимательней все есть название задачи и все такое
0