簡體   English   中英

我如何在方法之外初始化此數組?

[英]How can I initialize this array beyond the method?

我程序的一部分:

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”具有它應該具有的值(來自另一個類),但是我還需要其他方法中存儲的數組和值。 那么,如何在方法之外初始化數組,以便可以在每個方法中使用它們?

如果你這樣做

Item IA[]=new Item[maxamount];
int weightA[]=new int[maxamount];
String nameA[]=new String[maxamount];

IAweightAnameA將在您創建背包類的實例之前進行初始化

正如RC所建議的那樣,將它們放在構造函數中是一個好習慣。

請記住,構造函數在那里准備對象中所需的所有元素!

做對了,做得干凈!

您遇到的問題是Java在運行構造函數的主體之前先運行字段初始化程序。 因此,當執行此命令時:

Item IA[]=new Item[maxamount];
int weightA[]=new int[maxamount];
String nameA[]=new String[maxamount];

字段maxamount尚未分配。 (考慮它的另一種方法以及編譯器的實際作用是將上述初始化復制到構造函數的開頭 。)

解決方案是將初始化移到構造函數中:

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方法,那么您不應該這樣做。 (例如,請參閱此線程以了解原因。)使用以下方法之一:

  • 使設置方法final ;
  • 使班級final ;
  • 調用公共設置方法還使用的私有設置方法(例如_setMaxamount(ma) );
  • 或直接在構造函數中設置字段(我通常的方法)。

對於更復雜的情況(例如,正確的初始化要求調用可重寫的方法,例如抽象方法),請將構造函數設為私有,並使用靜態工廠方法或生成器模式創建類實例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM