任何人都可以解释为什么这段代码只在构造函数中工作?

时间:2015-06-08 20:48:06

标签: java android object constructor

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

Theres一类Flags声明为:

public class Flags {

private String mName;
private int mFlag;

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

我在另一个名为Page的类中使用此Flags类对象 如

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);
}





}

为什么我允许在我的Page类的构造函数中创建并初始化Flags类对象而不是在它之外?为什么通过将初始化放在构造函数中来解决此错误?提前谢谢。

2 个答案:

答案 0 :(得分:3)

您通常无法在方法正文之外发表声明,除非您指定了变量或它是初始化程序块。

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);
      // ...
   }

}

答案 1 :(得分:0)

每个语句都需要一个范围,换句话说,语句只能在方法内部运行。 当你写作 mFlags[1] = new Flags("America", R.mipmap.America);在一个类中但不在一个方法中,它没有任何意义。该代码什么时候应该运行?在哪堆栈?

运行时:private final Flags[] mFlags = new Flags[20];范围是构造函数。它相当于定义私有的最终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);
      // ...
   }

}

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