我一直在尝试用Java来声明一个数组,就像教程说的那样,但却收到了一个错误。这是我的代码:
public class ArrayExample {
private static final int SIZE = 15;
/* this works */
int[] arrayOfInt = new int[SIZE];
/* but this doesn't work, says "cannot find symbol" */
int[] arrOfInt;
arrOfInt = new int[SIZE];
public static void main(String[] args) {
/* but here it works; why? what's the difference? */
int[] arrOfInt;
arrOfInt = new int[SIZE];
}
}
我在教程中找不到这种差异的解释。为什么第二个声明不起作用,但main
方法中的第三个声明有效?
答案 0 :(得分:3)
您不能将赋值语句作为类定义的一部分编写。
使用第一种方法(首选)或将赋值移动到构造函数中(在这种情况下不是必需的,但如果在构造对象之前不知道大小,那么可能很有用 - 那么你可以将它传递给构造函数的参数。)
int[] arrOfInt;
public ArrayExample()
{
arrOfInt = new int[SIZE];
}
答案 1 :(得分:1)
如果您愿意,您甚至可以将变量的初始化插入到匿名代码块中,而不使用构造函数:
int[] arrOfInt;
{
arrOfInt = new int[SIZE];
}
答案 2 :(得分:1)
当你这样做时
int[] arrayOfInt = new int[SIZE];
编译器会阅读arrayOfInt
,并会记得用new int[SIZE]
初始化它。
arrayOfInt
的初始化不会发生在那一刻。
执行此操作时:
int[] arrOfInt;
arrOfInt = new int[SIZE];
编译器读取arrOfInt
但是当它到达第二行时它找不到arrOfInt的类型,记住编译器此时可能没有读取所有变量因此它说它找不到arrOfInt
,简而言之它不会检查它是否已读取具有相同名称的变量,因为它尚未完成其完整处理,并且它不在初始化块中。您仍然在代码的声明块中。
Method是一个声明+初始化块,因此编译器允许您在两个不同的点声明和初始化变量。
对于初始化,您可以使用构造函数或实例初始化块或静态初始化块。
答案 3 :(得分:0)
你不能将非状态值声明为静态方法,所以这是错误的
int []arrOfInt;
public static void main(String[] args) {
arrOfInt = new int[SIZE];
}
你可以像这样解决它
int []arrOfInt=new int[SIZE];
public static void main(String[] args) {
}
}
或者像这样
class ArrayExample{
int []arrOfInt;
public static void main(String args[]){
ArrayExample a = new ArrayExample();
a.arrOfInt=new int[a.SIZE];
}
}