Реализация метода toString в Java

#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 требуется другая буква.