Подтвердить что ты не робот

Метод getClass Java с типами массивов

Итак, я столкнулся с чем-то странным, и я не знаю, что он назвал, поэтому у меня возникают проблемы с поиском информации об этом, поэтому мой вопрос здесь.

У меня возникла проблема: если вы создаете массив любого типа и вызываете getClass в этом массиве на Java, вы получите нечетное возвращение. Мне интересно, почему вы получаете это конкретное возвращение и что это значит.

Пример кода выглядит следующим образом:

byte[] me = new byte[1];
int[] me2 = new int[1];
double[] me3 = new double[1];
float[] me4 = new float[1];
String[] me5 = new String[1];
Integer[] me6 = new Integer[1];

System.out.println(me.getClass());                  
System.out.println(me2.getClass());                 
System.out.println(me3.getClass());                 
System.out.println(me4.getClass());                 
System.out.println(me5.getClass());
System.out.println(me6.getClass());

а выход:

 class [B
 class [I
 class [D
 class [F
 class [Ljava.lang.String;
 class [Ljava.lang.Integer;
4b9b3361

Ответ 1

Метод toString класса вызывает метод getName класса, который

Возвращает имя объекта (класс, интерфейс, класс массива, тип примитива или void), представленного этим объектом класса, в виде строки. Если этот объект класса представляет ссылочный тип, который не является типом массива, тогда возвращается двоичное имя класса, как указано в Спецификации языка Java ™.

Если этот объект класса представляет примитивный тип или void, то возвращаемое имя является строкой, равной ключевому слову языка Java, соответствующему примитивному типу или void.

Если этот объект класса представляет класс массивов, то внутренняя форма имени состоит из имени типа элемента, которому предшествует один или несколько символов '[', представляющих глубину вложения массива. Кодировка имен типов элементов выглядит следующим образом:

 Element Type           Encoding
 boolean                Z
 byte                   B
 char                   C
 class or interface     Lclassname;
 double                 D
 float                  F
 int                    I
 long                   J
 short                  S 

Имя класса или интерфейса classname - это двоичное имя класса, указанного выше.

Примеры:

 String.class.getName()
     returns "java.lang.String"
 byte.class.getName()
     returns "byte"
 (new Object[3]).getClass().getName()
     returns "[Ljava.lang.Object;"
 (new int[3][4][5][6][7][8][9]).getClass().getName()
     returns "[[[[[[[I"

Ответ 2

Это просто какое-то глупое соглашение об именах. Было бы намного лучше, если бы они были более человечно читаемыми: class byte[], class java.lang.Integert[][]

Ответ 3

[ в начале имени класса следует читать как "массив...", а "..." - это то, что следует за [; нижеприведенные соглашения изложены в документации для Class.getName(), приведенной и связанной с @emory.

Раздел 4.3.1 Спецификации Java Language начинается: "Объект - это экземпляр класса или массив". Это говорит о том, что массивы не являются экземплярами классов. (Возможно, это то, на что @TigerTrussell получал в своем ответе.) Однако Раздел 10.8 начинается: "Каждый массив имеет связанный объект класса, общий со всеми другими массивами с одним и тем же типом компонента. Прямым суперклассом типа массива является Object." Это говорит о том, что массивы являются, если не истинными экземплярами класса, довольно близки.

К сожалению, правила синтаксиса для Java запрещают наследование типа массива:

public class MyFancyArray extends int[] { // ILLEGAL
   // ...
}

Обратите внимание, что это синтаксическое ограничение; нет концептуальных или семантических барьеров (и это допускается во многих других языках OO).

Ответ 4

Это имена объекта базового типа. [ указывает на массив, а следующая буква указывает тип массива. B = байт, я = целое число, D = double и т.д. "L" для членов класса типа, как вы можете видеть.

Ответ 5

Массивы не имеют классов, они просто структуры данных. Единственное, что имеет класс, было бы чем-то расширенным от Object, который включен в массив.