#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;