Почему java допускает приватную строку[][] var[]

#java #arrays

#java #массивы #переменные

Вопрос:

 private String[][] var[]
  

Этот код компилируется. Но разве они не должны создавать массив по типу или переменной?

Комментарии:

1. Странная вещь в Java, но скобки массива в имени переменной разрешены. По какой-то причине я видел только упоминание в руководстве Oracle о том, что оно работает в начале, и никогда не использовал его после этого. Я предполагаю, что это разделение здесь делает его 3D-массивом?

Ответ №1:

Код такой же, как этот:

 private String[][][] var;
  

Все эти формы эквивалентны:

 private String[][][] var;
private String[][] var[];
private String[] var[][];
private String var[][][];
  

И все они означают одно и то же: трехмерный массив строк. String var[][][] Синтаксис может показаться немного странным, но он предназначен для того, чтобы программисты на C / C чувствовали себя в Java как дома (именно так вы обычно объявляете тип массива в C / C ).

В Java String[][][] var синтаксис является предпочтительным, поскольку он дает понять, что тип var является String[][][] , в другом синтаксисе и его различных вариациях информация о типе разделяется до и после переменной — хотя это совершенно законно с точки зрения компилятора, это сложнее для чтения.

Что еще более странно, все эти объявления методов являются законными и эквивалентными:

 String[][][] m()  {return null;}
String[][] m() [] {return null;}
String[] m() [][] {return null;}
String m() [][][] {return null;}
  

Ответ №2:

Согласно JLS 10.2 в разделе о Array ‘s:

[] Может отображаться как часть типа в начале объявления или как часть декларатора для конкретной переменной, или и то, и другое.

Например:

byte[] rowvector, colvector, matrix[]; Это объявление эквивалентно:

byte rowvector[], colvector[], matrix[][];

(Выделено мной)

Обратите особое внимание на последний пример, где говорится, что byte[] matrix[] эквивалентно byte matrix[][] .

Так что нет, это не ошибка, просто выбор дизайна.

Комментарии:

1. Спасибо! Довольно интересно, что в JLS 10.2 для Java SE 8 уже указано : «Мы не рекомендуем «смешанную нотацию» в объявлениях переменных массива, где пары скобок появляются как в типе, так и в деклараторах; ни в объявлениях методов, где пары скобок появляются как до, так и после формального списка параметров».

Ответ №3:

В спецификации языка Java говорится

«Скобки разрешены в деклараторах как дань традиции C и C . Однако общие правила для объявления переменных разрешают использование скобок как в типе, так и в деклараторах, так что объявление локальной переменной»

в JLS 10.2 . На мой взгляд, квадратные скобки ( [] ) в «типах» придают массиву больше смысла, чем в объявленных переменных. Но для того, чтобы подтвердить традицию C / C , это было сделано так, как говорится в тексте в JLS. Другое дело, что смешивание квадратной скобки с обоими типами и переменными может сбить с толку читателей / программистов.

Ответ №4:

Ответ Оскара довольно хорош. Если бы кто-то читал String[][] var[] на английском языке, можно было бы сказать «var — это массив двумерных массивов строк», таким образом, «var — это трехмерный массив строк»

Ответ №5:

Это пример, который показывает вам, когда [] позиция имеет значение.

 String[] arr, arr2[];
  

arr Это массив String , тогда как arr2 это массив массивов String .

Как вы видите, это может быть полезно, если вы хотите объявлять разные массивы в одной строке.

И в вашем примере это мог быть другой, var2 объявленный в той же строке:

 private String[][] var[], var2;