Ну, так как в спецификации сказано:
"Если аргумент arg равен нулю, то результатом является" false ". Если arg является логическим или логическим значением, то результатом является строка, возвращаемая функцией String.valueOf (). В противном случае результатом будет" true ". "( src )
Поведение вполне ожидаемое, не так ли? Почему они решили реализовать это таким образом - не знаю, я бы согласился, что это не интуитивно понятно (но хорошо, что это следует за C, который также печатает что угодно, если вы даете ему неправильные аргументы;))