如何在方法之外初始化此数组?

时间:2016-12-06 18:28:37

标签: java oop

我的计划的一部分:

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以便我可以将它们用于每个方法呢?

2 个答案:

答案 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方法来初始化maxamountmaxweight。如果有可能在子类中覆盖setter方法,那么至少你不应该这样做。 (例如,请参阅this thread了解原因。)使用以下方法之一:

  • 制作setter方法final;
  • 制作课程final;
  • 调用公共setter方法也使用的私有setter方法(例如_setMaxamount(ma));
  • 或直接在构造函数中设置字段(我通常的方法)。

对于更复杂的情况(例如,正确的初始化需要调用可覆盖的方法,例如抽象方法),请将构造函数设为私有并使用static factory methodsbuilder pattern创建类实例。