class BoxPrinter<T> {
private T val;
public BoxPrinter(T arg) {
val = arg;
}
public String toString() {
return "{" + val + "}";
}
public T getValue() {
return val;
}
}
class B {
public static void main(String[] args) {
BoxPrinter<Integer> value1 = new BoxPrinter<Integer>(new Integer(10));
//////////тут///
System.out.println(value1);
////////////////
Integer intValue1 = value1.getValue();
BoxPrinter<String> value2 = new BoxPrinter<String>("Hello world");
///////////и тут////
System.out.println(value2);
///////////////////
}
}
В код особо не вдавайтесь скопипастил с сайта.Вопрос:почему помеченные строки println не выводят, как обычно, при попытке напечатать в консоль объект, что то вроде "BoxPrinter@1540e19d", а печатают "10" и "Hello World"?
Вот эта строка
System.out.println(value1);
эквивалентна следующей
System.out.println(value1.toString());
то есть будет вызван метод toString() (он определен в классе Object). В Вашем классе BoxPrinter этот метод переопределен:
public String toString() {
return "{" + val + "}";
}
Из-за этого в консоле Вы получаете 10 и "Hello World" вместо стандартного BoxPrinter@1540e19d.
Компилятор сделает эту строку:
System.out.println(value1);
В эту:
System.out.println(value1.toString());
Если метод toString() не определен то будет использоваться метод из класса Object, который определяется так:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
Это обозначает, что сначала будет выведено расположение класса, собачка и хэш-код объекта.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости