int[] numbers;
在没有初始化的情况下,如上所述声明后,我无法使用数字数组。 完成了使用它的所有步骤。试图分配值,使用填充和尝试的长度,并得出结论,这是一种错误的方式来声明一个数组,但我不明白为什么Java有这样的语法。这令人困惑。
答案 0 :(得分:2)
您只是定义了对数组的引用,但在您声明它之前,此引用不引用任何内容。对于它,您需要构造一个数组,唯一的方法是使用new
并将这个新分配的对象链接到引用。它在Java中非常一致,因为您了解对象是什么以及它们是如何构建的。
int []ref_array; // this is NOT an array, but a reference to an array, actually refers nothing
ref_array = new int[10]; // new construct a object that contains 10 ints and array refers to it.
ref_array[3]; // means get the object that ref_array refers, get the array inside and take the 4th value stored in it. A handy shortcut...
答案 1 :(得分:1)
为什么呢?因为有时您需要根据条件运行时信息初始化数组:
void syntheticExample(int[] these, int[] those, int[] theOthers) {
int[] numbers;
// ...some work...
if (/*...some condition...*/) {
numbers = these;
} else {
// ...more work, then:
if (/*...some other condition...*/) {
numbers = those;
} else if (/*...some further condition...*/) {
numbers = theOthers;
} else {
// We'll use our own numbers
numbers = new int[] {1, 2, 3};
}
}
// ...use `numbers`...
}
它与我们可以声明任何其他类型的变量而不初始化它的原因相同。声明和初始化/赋值是不同的东西,有时它们需要在不同的时间发生。
Jean-Baptiste's distinction在这里很有用和重要:上面的numbers
是一个变量,它包含一个对象引用。 引用的内容是一个数组(如果我们为其分配null
,则没有任何内容)。