private String[][] var[]
此代码编译。但是他们不应该在类型或变量上创建数组吗?
答案 0 :(得分:8)
代码与此相同:
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;}
答案 1 :(得分:7)
根据有关Array
的部分中的JLS 10.2:
[]
可以在声明的开头显示为类型的一部分,也可以作为特定变量(或两者)的声明符的一部分。例如:
byte[] rowvector, colvector, matrix[];
该声明等效于:
byte rowvector[], colvector[], matrix[][];
(强调我的)
请特别注意最后一个示例,其中说byte[] matrix[]
等效于byte matrix[][]
。
所以不,这不是bug,仅仅是设计选择。
答案 2 :(得分:3)
The Java Language Specification说
JLS 10.2中的“作为对C传统的点头,允许在声明者中使用括号 和C ++。但是,变量声明的一般规则允许 括号出现在类型和声明符中,以便 局部变量声明“
。在我看来,“类型”中的方括号([]
)比声明的变量更能理解数组。但是为了确认C / C ++的传统,它是按照JLS中的文本所做的那样完成的。另一件事是,将方括号与两种类型和变量混合在一起会让读者/程序员感到困惑。
答案 3 :(得分:1)
奥斯卡的答案非常好。如果要用英语阅读String[][] var[]
,可以说" var是一个二维字符串数组的数组"因此" var是一个三维字符串数组"
答案 4 :(得分:1)
这是一个示例,显示[]
位置何时发挥作用。
String[] arr, arr2[];
arr
是String
的数组,而arr2
是String
的数组数组。
如果你想在同一行上声明不同的数组,你可以看到它是有益的。
在你的例子中,它可能是在同一行声明的另一个var2
:
private String[][] var[], var2;