четверг, 18 января 2007 г.

Java Puzzle 12: ABC

String letters = "ABC";
char[] numbers[] = {'1', '2', '3'};
System.out.print(letters + " easy as " + numbers);
Что будет напечатано?

А если попробовать так:
String letters = "ABC";
char[] numbers = {'1', '2', '3'};
System.out.print(letters);
System.out.print(" easy as ");
System.out.print(numbers);
то будет ожидаемый результат:
ABC easy as 123

А с небольшим изменением:
String letters = "ABC";
Object numbers = {'1', '2', '3'};
System.out.print(letters);
System.out.print(" easy as ");
System.out.print(numbers);
результат опять будет неправильным.

Дело в том, что при конкатенации строк используется метод toString(). А массив символов, как и любой другой массив, не переопределяет этот метод. В то же время, класс PrintStream определяет метод print(char[]), который корректно выводит символы в поток. Однако, в третьем случае вызывается метод print(Object), который несмотря на то, что аргумент - массив символов, вызывает у него метод toString().
Для преобразования массива символов к строке авторы рекомендуют использовать метод String.valueOf(char[]).

Java Puzzle 11: The Last Laugh

Рассмотрим следущие выражения:
System.out.print("H" + 'a');
System.out.print('H' + 'a');

Результат первого: "Ha", а второго - 169. Причем тип второго выражения int. Вывод: оператор + выполняет конкатенацию строк только если один из операндов является строкой.

English

Сегодня узнал, что американцы подразумевают вежливый отказ, говоря:
I'll think about it.