3
private String[][] var[]

此代码编译。但是他们不应该在类型或变量上创建数组吗?

4

5 回答 5

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语法是首选的,因为它清楚地表明了is的类型,在其他语法及其不同的变体中,类型信息在变量之前和之后被分割——尽管从编译器的角度来看它是完全合法的,但很难读。varString[][][]

更奇怪的是,所有这些方法声明都是合法且等价的:

String[][][] m()  {return null;}
String[][] m() [] {return null;}
String[] m() [][] {return null;}
String m() [][][] {return null;}
于 2012-09-21T03:49:58.370 回答
7

根据JLS 10.2关于Array's 的部分:

可以作为类型的[]一部分出现在声明的开头,或者作为特定变量的声明符的一部分,或者两者兼而有之

例如:

byte[] rowvector, colvector, matrix[]; 这个声明等价于:

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

(强调我的)

特别注意最后一个例子,它说byte[] matrix[]相当于byte matrix[][].

所以不,这不是一个错误,只是一个设计选择。

于 2019-04-23T19:50:51.850 回答
3

Java 语言规范

“声明符中允许使用括号作为对 C 和 C++ 传统的致敬。但是,变量声明的一般规则允许括号出现在类型和声明符中,以便局部变量声明”

JLS 10.2中。在我看来,“类型”中的方括号 ( []) 比声明变量中的数组更有意义。但是为了确认 C/C++ 的传统,它是按照 JLS 中的文本所说的那样完成的。另一件事是,将方括号与类型和变量混合使用会使读者/程序员感到困惑。

于 2012-09-21T04:11:51.880 回答
1

奥斯卡的回答很好。如果String[][] var[]用英文阅读,会说“var 是二维字符串数组的数组”,因此“var 是三维字符串数组”

于 2012-09-21T04:04:05.590 回答
1

这是一个向您展示[]位置何时产生影响的示例。

String[] arr, arr2[];

是的arr数组,Stringarr2是 的数组的数组String

如果您想在同一行上声明不同的数组,这可能是有益的。

在您的示例中,它可能是var2在同一行上声明的另一个:

private String[][] var[], var2;
于 2012-09-21T06:54:25.697 回答