Является ли toString также для примитивных типов?
Я знаю, что toString
вызывается в Java
всякий раз, когда мы печатаем объект, и это по умолчанию определено в классе Object
, который является суперклассом всех классов.
Но мои преподаватели говорят, что toString
также вызывается, когда мы печатаем некоторые primitive type
(int, char
и т.д.).
Это правда?
Ответы
Ответ 1
Да, но не в том смысле, что вы ожидаете, что это будет.
System.out.println(someInt)
является просто оболочкой для print
, которая также добавляет строку.
System.out.print(someInt)
вызывает
String.valueOf(someInt)
который, в свою очередь, вызывает
Integer.toString(someInt)
который статический метод в классе Integer, который возвращает a String
, представляющий указанное целое число. Этот метод не совпадает с Integer#toString()
, методом экземпляра, который преобразует его объект Integer в строку, представляющую ее значение int.
someInt.toString()
не будет работать, поскольку someInt
не расширяет Object
из-за того, что он не является объектом.
Ответ 2
Давайте посмотрим, как работает System.out.print(int)
. Согласно System
API System.out
есть PrintStream
:
public static final PrintStream out
В PrintStream
src мы видим, как он печатает ints:
public void print(int i) {
write(String.valueOf(i));
}
И это String.valueOf(int)
из String
src:
public static String valueOf(int i) {
return Integer.toString(i);
}
Ответ 3
Если вы рассматриваете следующий код
System.out.println(5);
Следующее произойдет
public void println(int x) {
synchronized (this) {
print(x);
newLine();
}
}
из класса PrintStream
будет вызываться, который внутренне вызовет функцию print(x)
следующим образом -
public void print(int i) {
write(String.valueOf(i));
}
и теперь, если вы видите функцию valueOf() в классе String
public static String valueOf(int i) {
return Integer.toString(i);
}
и
Integer.toString(i)
- это то, что ваш учитель имел в виду, вызывая метод toString().
Ответ 4
Примитивы autoboxed к их соответствующему типу объекта. Итак, toString()
вызовет.