我有一个(相当静态的)类,如:
class Test
{
private Planet gault;
private Planet irtok;
private Planet ktaris;
/* problem:
private Planet [] planets = {
this.gault, this.irtok, this.ktaris
};
*/
Test() {
}
public void doTest() {
this.gault = new Planet("Klingon", 1322);
this.irtok = new Planet("Ferengi", 1213);
this.ktaris = new Planet("Ktarian", 16512);
}
}
我想要的(如果可以的话)是有一个指向每个星球的数组 - 。
private Planet [] planets = {
this.gault, this.irtok, this.ktaris
};
这样我doTest()
可以做类似的事情:
for (Planet p: in planets)
p.printInfo();
从我尝试的各种方式来看,我总是以p
为空;
答案 0 :(得分:3)
从我尝试的各种方式来看,我总是以p为NULL;
这很可能是因为复制后的字段为null
private Planet [] planets = {
this.gault, this.irtok, this.ktaris
};
我建议制作这些行星final
。
private final Planet gault = new Planet("Klingon", 1322);
private final Planet irtok = new Planet("Ferengi", 1213);
private final Planet ktaris = new Planet("Ktarian", 16512);
使用调试器是一种检查此方法的简单方法。
答案 1 :(得分:3)
默认情况下,您的行星为空。您只能使用doTest()
方法初始化它们。但是,在构建Test对象之前很久就会执行初始化行星数组的行。所以此时,所有行星仍为空,因为尚未调用doTest()
。
阵列应该在行星之后立即初始化。一切都应该在构造函数中完成,而不是在doTest()
中完成。
答案 2 :(得分:1)
制作一个引用星球的课程PlanetHolder
:
public class PlanetHolder {
Planet p
}
现在将代码更改为以下内容:
class Test {
private PlanetHolder gault = new PlanetHolder();
private PlanetHolder irtok = new PlanetHolder();
private PlanetHolder ktaris = new PlanetHolder();
private PlanetHolder [] planets = {
this.gault, this.irtok, this.ktaris
};
public void doTest() {
this.gault.p = new Planet("Klingon", 1322);
this.irtok.p = new Planet("Ferengi", 1213);
this.ktaris.p = new Planet("Ktarian", 16512);
}
}
现在你可以遍历行星并打印它们:
for (PlanetHolder p : planets) {
p.p.printInfo();
}