Java 这些不同类型的阵列增量是如何工作的?

Java 这些不同类型的阵列增量是如何工作的?,java,arrays,Java,Arrays,所以我知道的是,您可以通过以下方式声明数组: int[] arr; 要初始化它,请执行以下操作: arr = new int [integer] 这些语句还可以组合为: int[] arr = new int[integer]; 另外,声明、初始化和填充数组值的组合对我来说似乎很清楚: int[] arr = {1, 2, 4, 5, 9}; 然而,让我困惑的是,这也能起作用: int[] testAr = new int[]{1, 2, 3, 4}; 更让我困惑的是多维数组的相同原理

所以我知道的是,您可以通过以下方式声明数组:

int[] arr;
要初始化它,请执行以下操作:

arr = new int [integer]
这些语句还可以组合为:

int[] arr = new int[integer];
另外,声明、初始化和填充数组值的组合对我来说似乎很清楚:

int[] arr = {1, 2, 4, 5, 9};
然而,让我困惑的是,这也能起作用:

int[] testAr = new int[]{1, 2, 3, 4};
更让我困惑的是多维数组的相同原理:

int[][] yarr = new int[][]{ new int[]{1, 2}, new int[]{2, 3}, new int[]{3, 4} };
为什么会这样,这里到底发生了什么?我有没有理由像前两个版本那样创建一个数组?另外,当我思考这个问题时,为什么在直接用值填充数组时可以省略new关键字?
我刚刚开始学习对象,这与我目前所知的基本原则背道而驰。

语句
int[]arr={1,2,3}
是语句
int[]arr=newint[]{1,2,3}的快捷方式

语句
int[][]arr=newint[]{{1,2},{3,4}}
是语句
newint[]{1,2},newint[]{3,4}
的快捷方式

它们完全相同,第一个添加了一些语法糖以简化数组初始化。根据规范:

数组初始值设定项可以在声明中指定,也可以作为数组创建表达式的一部分来创建数组并提供一些初始值

如果在不同的作用域中使用初始化器,则会发生编译时错误。比如说,

class Test {
    public static void main(String[] args) {
        method({1, 2, 3});          // it is not allowed
        method(new int[]{1, 2, 3}); // it is fine
    }

    static void method(int[] ints) { ... }
}

为什么这样做有效?因为这就是语言的定义。
newint[]{1,2,3,4}
是创建和初始化数组最常用的方法。没有
newint[]
的方法只是语法上的糖分,但只能在声明变量的同时起作用(例如
int[]arr;arr={1,2,3};
是不允许的)