#java #arrays #reference #tostring #primitive-types
#java #массивы #ссылка #tostring #примитивные типы
Вопрос:
Когда я хочу напечатать пустой массив Boolean
(ссылочного типа), результат будет выглядеть как вывод #1. Но когда я хочу напечатать пустой массив примитивного логического типа, результатом будет вывод #2. Я знаю, что toString()
метод в Object
классе выполняется по умолчанию. Реализация этого метода по умолчанию выглядит следующим образом:
this.getClass().getName() "@" Integer.toHexString(this.hashCode());
Но интересно, почему Z записывается в выводе примитивного типа, однако для int это I?
public class ToStringApp {
public static void main(String[] args) {
Boolean[] refs = new Boolean[1];
System.out.println(refs);
// output #1: [Ljava.lang.Boolean;@3764951d
boolean[] prims = new boolean[1];
System.out.println(prims);
// output #2: [Z@4b1210ee
int[] ints = new int[0];
System.out.println(ints);
// output #3: [I@4d7e1886
}
}
Комментарии:
1. И в чем именно заключается ваш вопрос?
2. Почему Z записывается в выводе логического (примитивного типа) массива, однако для типа int это I?
3. Потому
[Z
что это имяboolean[].class
, и[I
это имяint[].class
.
Ответ №1:
Это то, что говорит Javadoc из Class
s getName()
:
Строка java.lang.Class.getName()
Возвращает имя объекта (класса, интерфейса, класса массива, примитивного типа или void), представленного этим объектом класса, в виде строки. … Если этот объект класса представляет класс массивов, то внутренняя форма имени состоит из имени типа элемента, которому предшествует один или несколько символов ‘[‘, представляющих глубину вложенности массива. Кодировка имен типов элементов выглядит следующим образом:
Тип элемента Кодирование логическое значение Z байт B символ C класс или интерфейс Lclassname; двойной D float F int Я длинный J короткий S
Как вы можете видеть, B
уже занято byte
, поэтому boolean
требуется другая буква.