我的计划的一部分:
public class Backpack {
private int maxamount, maxweight;
public Backpack(int ma, int mw){
setMaxamount(ma);
setMaxweight(mw);
}
public void setMaxamount(int ma){
this.maxamount=ma;
}
public void setMaxweight(int mw){
this.maxweight=mw;
}
Item IA[]=new Item[maxamount];
int weightA[]=new int[maxamount];
String nameA[]=new String[maxamount];
public char addItem(Item I){
...
当我使用变量" maxamount"没有价值,我无法在数组中存储值,但是当我使用它时:
public class Backpack {
private int maxamount, maxweight;
public Backpack(int ma, int mw){
setMaxamount(ma);
setMaxweight(mw);
}
public void setMaxamount(int ma){
this.maxamount=ma;
}
public void setMaxweight(int mw){
this.maxweight=mw;
}
public char addItem(Item I){
Item IA[]=new Item[maxamount];
int weightA[]=new int[maxamount];
String nameA[]=new String[maxamount];
...
," maxamount"它具有它应该拥有的值(来自另一个类),但我也需要数组和其他方法中存储的值。那么如何从方法中初始化Arrays以便我可以将它们用于每个方法呢?
答案 0 :(得分:0)
如果你这样做
Item IA[]=new Item[maxamount];
int weightA[]=new int[maxamount];
String nameA[]=new String[maxamount];
IA , weightA 和 nameA 将在您创建类背包实例之前进行初始化
正如RC所建议的那样,将它们放在构造函数中是一个好习惯......
请记住,构造函数用于准备对象中所需的所有元素!
做得对,干净!
答案 1 :(得分:0)
您遇到的问题是Java在运行构造函数体之前运行字段初始值设定项。所以当执行时:
Item IA[]=new Item[maxamount];
int weightA[]=new int[maxamount];
String nameA[]=new String[maxamount];
尚未分配字段maxamount
。 (考虑它的另一种方式 - 以及编译器实际执行的操作 - 是将上述初始化复制到构造函数的 start 。)
解决方案是将初始化移动到构造函数中:
Item IA[];
int weightA[];
String nameA[];
public Backpack(int ma, int mw){
setMaxamount(ma);
setMaxweight(mw);
IA[]=new Item[maxamount];
weightA[]=new int[maxamount];
nameA[]=new String[maxamount];
}
顺便说一句,您不应该通过从构造函数中调用setter方法来初始化maxamount
和maxweight
。如果有可能在子类中覆盖setter方法,那么至少你不应该这样做。 (例如,请参阅this thread了解原因。)使用以下方法之一:
final
; final
; _setMaxamount(ma)
); 对于更复杂的情况(例如,正确的初始化需要调用可覆盖的方法,例如抽象方法),请将构造函数设为私有并使用static factory methods或builder pattern创建类实例。