0

我一直在尝试像教程所说的那样在 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方法中的第三个声明起作用?

4

4 回答 4

3

您不能将赋值语句编写为类定义的一部分。

使用第一种方法(首选)或将赋值移动到构造函数中(在这种情况下不是必需的,但如果在构造对象之前不知道大小,则可能很有用 - 然后您可以将其作为参数传递给构造函数)。

int[] arrOfInt;

public ArrayExample()
{
    arrOfInt = new int[SIZE];
}
于 2012-05-13T16:26:15.513 回答
1

当你这样做时

int[] arrayOfInt = new int[SIZE];

编译器将读取arrayOfInt并记住用new int[SIZE].

arrayOfInt在那一刻不会发生初始化。

当你这样做时:

int[] arrOfInt;
arrOfInt = new int[SIZE];

编译器读取arrOfInt但是当它到达第二行时它没有找到 arrOfInt 的类型,记住此时编译器可能没有读取所有变量因此它说它找不到arrOfInt,简而言之它不会检查它是否已经读取了一个变量与 not 同名,因为它尚未完成其完整的处理并且它不在初始化块中。您仍然在代码的声明块中。

方法是声明+初始化块,因此编译器允许您在两个不同的点声明和初始化变量。

对于初始化,您可以使用构造函数或实例初始化块或静态初始化块。

  • 静态初始化块在加载类时执行一次。
  • 实例初始化块每次创建类的实例时都会执行,并且在类的构造函数中完成对 super 的调用后,它们将按照类中定义的方式执行。
于 2012-05-13T16:41:22.470 回答
1

如果愿意,您甚至可以将变量的初始化插入到类匿名代码块中,而无需使用构造函数,方式如下:

int[] arrOfInt;

 {
arrOfInt = new int[SIZE];
} 
于 2012-05-13T16:28:29.293 回答
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];
   }
}
于 2012-05-13T16:41:14.867 回答