Я знаю, что способ println
объекта System.out
может использоваться для печати любого объекта, независимо от того, к какому классу он принадлежит. Но может ли кто-нибудь сказать мне механизм, который использует println
для выполнения этой задачи?Какой механизм использует println?
ответ
Вызов System.out.println
на объекте использует Object
«s toString()
метод - либо реализация по умолчанию в Object
классе, или реализации классов, которые переопределяют это значение по умолчанию.
System.out.println, в конце концов использует один из различных методов println
PrintStream
«ы, так как System.out
является PrintStream
экземпляром.
Если вы передадите String
на номер System.out.println
, он позвонит println(String)
. Если вы передадите ему char[]
, он назовет println(char[])
. Если вы передадите любой другой тип Object
, он вызовет println(Object)
(если компилятор не решает преобразовать Object
в String
, используя метод toString()
объекта, а затем позвоните по номеру println(String)
).
println(Object x)
преобразует Object
к String
по телефону String.valueOf()
, который возвращает либо «нуль» (для нулевых объектов) или obj.toString()
.
В любом случае используется метод Object
toString()
, если только Object
не имеет значения.
Метод 'println' принимает только вход' String'. Логика компилятора использует метод 'toString()', когда это необходимо. Поскольку 'println' ожидает' String', а не 'Object' (если это не объект' String'), компилятор преобразует объект в 'String' с помощью метода' toString() '. Это не что иное, как выполнение следующего: 'final Object o = new SomeObject(); final String oString =" "+ o;' – Jared
@Jared 'println' перегружен, чтобы принять вход' Object' (также 'boolean' , 'int',' float' и т. д.). Вы можете видеть это из API. – khelwood
@ Jared PrintStream имеет много перегруженных версий println.Некоторые принимают примитивы, один принимает строку и принимает объект. – Eran
Существует очень мало различий между тем, как PrintStream/PrintWriter.println(...)
обрабатывает String
и способ компилятора обрабатывает String
. Потоки печати автоматически преобразуют Object
в String
с помощью метода toString()
, если только этот объект не является null
(в этом случае он печатает null
). Разница заключается в том, что вы не можете установить String
объект общей Object
--but вы можете сцепить в String
объект с общей целью Object
, которые будут каскадной через toString()
метода (если Object
не null
). Честно говоря, это нормально, как вы бы использовали метод toString()
. Вот пример программы, которая иллюстрирует различия:
public class PrintStreamTester {
public static void main(String... args) {
final MyObject o1 = null;
final MyObject o2 = new MyObject("blah blah blah");
String s1 = "o1.toString() failed";
try {
s1 = o1.toString();
} catch (NullPointerException npe) {
// who cares
}
final String s2 = "" + o1;
final String s3 = o2.toString();
final String s4 = "" + o2;
System.out.println("o1 by itself (below):");
System.out.println(o1);
System.out.println("o1's toString(): " + s1);
System.out.println("o1's \"\" + o1: " + s2);
System.out.println("o2 by itself (below):");
System.out.println(o2);
System.out.println("o2's toString(): " + s3);
System.out.println("o2's \"\" + o1: " + s4);
}
}
class MyObject {
private final String string;
public MyObject(final String string) {
this.string = string;
}
@Override
public String toString() {
return string;
}
}
Вот выход из этой программы:
o1 by itself (below):
null
o1's toString(): o1.toString() failed
o1's "" + o1: null
o2 by itself (below):
blah blah blah
o2's toString(): blah blah blah
o2's "" + o1: blah blah blah
- 1. Какой механизм хранения использует TFS2010?
- 2. Какой механизм использует PIPES для «пробуждения» получателя?
- 3. Какой механизм хранения использует Wordpress 3.6?
- 4. Какой механизм компиляции/связывания использует glm?
- 5. Какой механизм визуализации использует Visual Studio для HTML?
- 6. Какой механизм использует git для поиска своего репозитория?
- 7. Какой механизм базы данных использует FILE001.DAT, FILE003.DAT, SYMBOLS.IDX?
- 8. Какой механизм использует gdb, чтобы узнать, где «завершить» вызов функции?
- 9. Какой механизм рендеринга использует cfdocument для преобразования HTML-> PDF?
- 10. Какой механизм правил использовать?
- 11. Использует ли Println() память в реальном приложении?
- 12. Какой движок рендеринга использует Ionic?
- 13. Какой рекомендуемый чистый механизм отказа
- 14. Какой слой реализовать Механизм транзакции
- 15. Какой механизм рабочего процесса выбрать?
- 16. Какой механизм Workflow вы рекомендуете?
- 17. Какой механизм шаблонов используется в Lets-Chat?
- 18. Какой механизм поддерживает сеанс Oracle на сервере?
- 19. Какой механизм использовать для push-сообщений?
- 20. Использует ли механизм «привязки» использование шаблона MVC?
- 21. Какой массив использует PHP?
- 22. Какой алгоритм использует Bitmap.smoothing?
- 23. reset_password_instructions.html.erb использует какой макет
- 24. Какой шифр использует MachineKey.Protect()?
- 25. Какой пакет использует Python?
- 26. Какой сервер использует jipster?
- 27. Проверьте, какой браузер использует
- 28. Какой алгоритм использует table.sort?
- 29. Какой алгоритм использует Math.random?
- 30. Какой хэш использует mysql?
Почему вы не смотрите на исходный код один раз? –
@ sᴜʀᴇsʜᴀᴛᴛᴀ механизм не сразу очевиден. –
@ ThorbjørnRavnAndersen: по крайней мере, в JDK 7 'println (Object o)' просто вызывает 'String.valueOf (o)', который, в свою очередь, проверяет 'null' и вызывает' o.toString() '. Это всего лишь три клика в среде IDE, чтобы узнать ... – Axel