例如:为什么这个语句long[] n= new long[];
是错误的,但这句话
long[][] n= new long[1][];
是对的吗?内存如何知道需要在第二个语句中为对象分配多少内存?
答案 0 :(得分:9)
内存如何知道需要在第二个语句中为对象分配多少内存?
要记住两件事要弄清楚发生了什么:
所以在这个例子中,你创建了一个longs数组(大小为1)来保存另一个long数组 - 但是你还没有创建第二个数组(所以你不需要指定它的大小)将来。)实际上,第一个数组提供了一个空的“槽”(如果外部数组长于1,则为槽),内部数组可以放入 - 但内部数组还没有已创建,因此无需指定其大小。
它不仅仅创建一个任意长度的数组,它根本不会创建任何内部数组。
如果您尝试在2D数组中访问或存储long,则可以更清楚地看到这一点:
long[][] x = new long[2][];
x[0][0] = 7;
...将生成NullPointerException
(在第二行),因为没有要访问的内部数组。
在第一个没有编译的例子中,你试图实际创建一个long数组,但不给它一个维度,因此错误。
答案 1 :(得分:2)
当你写这篇文章时 - long[][] n= new long[1][];
您正在创建long
的数组数组,但您实际上并未实际初始化数组
因此,如果您执行n[0] == null
,则会返回true
这样你可以在以后的任何时间点自由地初始化新数组 -
n[0] = new long[10];
重点是 - 你需要在初始化数组时提供大小,这就是long[] n= new long[];
错误的原因