谁能解释为什么这段代码只在构造函数中起作用?

Can anyone explain why this snippet of code is working in the constructor only?

我是 Java 和 Android 开发的初学者,最近开始开发一个简单的 Android 应用程序,但是我最近遇到了一个我能够解决的问题通过反复试验来解决。由于我无法弄清楚这种行为的确切原因,请给我一些见解。

有一个 class 标志声明为:

public class Flags {

private String mName;
private int mFlag;

Flags(String name, int flag) {
    mName=name;
    mFlag=flag;
}
}

我在另一个名为 Page 的 class 对象中使用了这个 Flags class 对象 作为

public class Page {

private Flags[] mFlags;
//This code is giving me error
mFlags = new Flags[20];
mFlags[1] = new Flags("America", R.mipmap.America);
mFlags[2] = new Flags("Australia", R.mipmap.AUSTRALIA);




Page()
{
 //This code is correct and not giving any error.
    mFlags = new Flags[20];
mFlags[1] = new Flags("America", R.mipmap.America);
mFlags[2] = new Flags("Australia", R.mipmap.AUSTRALIA);
mFlags[3] = new Flags("Austria", R.mipmap.AUSTRIA);
mFlags[4] = new Flags("Bangladesh", R.mipmap.BANGLADESH);
mFlags[5] = new Flags("Canada", R.mipmap.CANADA);
mFlags[6] = new Flags("Chile", R.mipmap.CHILE);
mFlags[7] = new Flags("China", R.mipmap.CHINA);
}





}

为什么我可以在页面 class 的构造函数内部而不是外部创建和初始化 Flags class 对象?为什么通过将我的初始化放在构造函数中来解决此错误?提前谢谢你。

您通常不能在方法主体之外有语句,除非您正在分配一个变量或者它是一个初始化程序块。

public class Page {
   private final Flags[] mFlags = new Flags[20];

   // initializer block
   {
      mFlags[1] = new Flags("America", R.mipmap.America);
      mFlags[2] = new Flags("Australia", R.mipmap.AUSTRALIA);
      // ...
   }

}

每个语句都需要一个作用域,换句话说,语句只能在方法内部运行。 当你写 mFlags[1] = new Flags("America", R.mipmap.America); 在 class 中而不是在方法中,这是没有意义的。此代码应该在什么时候 运行?在哪个堆栈上?

当您 运行 这样做时: private final Flags[] mFlags = new Flags[20]; 范围是构造函数。相当于定义了private final Flags[] mFlags 然后写成mFlags = new Flags[20];在构造函数的开头。 (您拥有的每个构造函数)。

Java 只是让您更容易定义属性并在同一行中初始化它们以获得更好的可见性,并避免您在每次构造函数重载时都对其进行初始化。

也是如此
private final Flags[] mFlags = new Flags[20];

   // initializer block
   {
      mFlags[1] = new Flags("America", R.mipmap.America);
      mFlags[2] = new Flags("Australia", R.mipmap.AUSTRALIA);
      // ...
   }

}

这是构造函数范围内的一段代码。要验证这一点,您可以在其中一个块中抛出异常并查看堆栈跟踪。