A K*_*A K 1 java arrays initialization
如果我尝试在声明语句以外的语句上使用大括号初始化数组,为什么会出现编译错误
class Demo {
public static void main(String[] args) {
String[] myName;
myName = {"AA", "BB", "CC"};
for(String s: myName) {
System.out.print(s + " ");
}
}
}
Run Code Online (Sandbox Code Playgroud)
只在声明语句中使用大括号初始化有什么意义?
demo.java:4: error: illegal start of expression
myName = {"AA", "BB", "CC"};
^
demo.java:4: error: not a statement
myName = {"AA", "BB", "CC"};
^
demo.java:4: error: ';' expected
myName = {"AA", "BB", "CC"};
^
demo.java:5: error: illegal start of type
for(String s: myName) {
^
demo.java:5: error: ')' expected
for(String s: myName) {
^
demo.java:5: error: <identifier> expected
for(String s: myName) {
^
demo.java:10: error: class, interface, or enum expected
}
^
7 errors
Run Code Online (Sandbox Code Playgroud)
如果我尝试在声明语句以外的语句上使用大括号初始化数组,为什么会出现编译错误
因为基本上在Java中执行它是无效的.编译器只是强制执行Java语言规范的规则.您需要指定数组类型:
myName = new String[] { ... };
Run Code Online (Sandbox Code Playgroud)
可以在声明(第8.3节,第9.3节,第14.4节)中指定数组初始值设定项,或者作为数组创建表达式(第15.10节)的一部分,以创建数组并提供一些初始值.
声明的各个部分包括这个制作:
VariableInitializer:
Expression
ArrayInitializer
Run Code Online (Sandbox Code Playgroud)
而数组创建表达式(第15.10节)是:
ArrayCreationExpression:
new PrimitiveType DimExprs Dimsopt
new ClassOrInterfaceType DimExprs Dimsopt
new PrimitiveType Dims ArrayInitializer
new ClassOrInterfaceType Dims ArrayInitializer
DimExprs:
DimExpr
DimExprs DimExpr
DimExpr:
[ Expression ]
Dims:
[ ]
Dims [ ]
Run Code Online (Sandbox Code Playgroud)
后来:
只在声明语句中使用大括号初始化有什么意义?
我怀疑它在其他方面简化了语言规范.我同意你看起来应该能够做到这一点 - 你可能希望编译器能够从变量类型推断出数组类型,就像在声明时那样.但请记住,在一般情况下,大部分的语言,赋值运算符的右侧表达式的类型不受到赋值的目标.对于正常语句中的每个表达式类型而言,通常在语言术语上更整洁,以便在不引用同一语句中的其他表达式的情况下进行良好定义.
使用数组创建表达式修复代码是相当容易的修复,所以我会忍受它.
语法的正确写法是:
myName = new String[]{"AA", "BB", "CC"};
Run Code Online (Sandbox Code Playgroud)
我怀疑Java不允许省略的原因new String[]是,在许多情况下,编译器无法从元素类型中找出所需的数组类型。假设您被允许写:
{1, 2, 3}
Run Code Online (Sandbox Code Playgroud)
那是int[],Integer[],Number[]或Object[]?
唯一可以忽略的地方new String[]是初始化程序,在该程序中编译器已经知道数组类型。