簡體   English   中英

初始化成員變量而不是實例變量

[英]initializing a member variable instead of an instance variable

我遇到了一個名為arrayList的類,該類表示對象列表並支持通過數字位置索引對其對象的隨機訪問。

解決了toString()size()的問題后,我遇到了一個不初始化成員數組的問題。 僅初始化一個語言環境變量。 但是,我的印象是,我進行的修改應該可以解決該問題。

public Object get(int a) {
    if (a < 0 || a >= logicalSize) {
        throw new IndexOutOfBoundsException("Positions must be from position 0 to position "+
                                            (logicalSize - 1));
    }
    else {
        return array[a];
    }
} 

但是我不應該聲明private static Object[] array = new Object[5]; 解決那個?

我目前在拋出異常時遇到錯誤,告訴我我的排名必須在0到-1之間,表明未創建。

完整代碼:

public class Tester  {
        public static void main(String [] args)
        {
            arrayList a1, a2;
            a1 = new arrayList();
            a2 = new arrayList(5);
            a2.size();
            System.out.println(a1.toString());
            //System.out.println(a2.toString());
        }
    }

public class arrayList
{
    private int logicalSize;
    private static Object[] array = new Object[0];
    private Object[] original;
    private Object removedElement;

    public arrayList()
    {
        Object[] array = new Object[]{null,null,null,null,null}; 
    }

    public arrayList(int i)
    {
        logicalSize = i;
        Object[] array = new Object[logicalSize - 1];
    }

    public arrayList(Object[] array)
    {
       logicalSize = array.length;
       Object[] copyArray = array;
    }

    public String toString(Object[] array)
    {
       String str = " ";

       for(int a = 0; a < logicalSize; a++)
       {
          str = str + array[a];
       }

       str = str + "\nSize: " + size();
      return str;
   }  

   public int size()
   {
       int length = array.length;
       return length;
   }
}

非常感謝,Packerfan504

首先,您應該遵循Java約定中的類名。 它應該以大寫字母開頭,然后轉到CamelCase。

array當然應該是static 當您聲明成員static ,意味着它在所有實例之間共享

在構造函數中,設置局部變量而不是成員。

 // remove Object[] in front
 array = new Object[]{null,null,null,null,null};

數組的構造函數未設置成員array

public arrayList(Object[] array)
{
   logicalSize = array.length;
   //Object[] copyArray = array;
   this.array = array;
}

這不會做任何復制:成員引用作為參數傳遞的數組。 我想要某種“復制構造函數”,實際上需要實例化一個新數組並復制每個元素。 或使用Arrays.copyOf()

您應該使用正確的簽名覆蓋 java.langObject toString()方法(為什么將數組作為參數傳遞?)。 Java中的所有類都隱式擴展了Object類。

您應該區分Object[]數組的大小-這是需要增加數組之前的電位槽的數量,以及反映您在數組中放置的元素數量的邏輯大小。 在這里,您將邏輯大小設置為array.length,那只是多余的信息。


編輯其他建議

在以size為參數的構造函數中,創建一個數組(logicalSize-1)。 為什么?

在默認構造函數中,您無需初始化logicalSize ,然后將其設置為0 對我來說可以,但是,為什么要在構造函數中以大小作為參數將其設置為i呢? 然后在a1.get(0)是正常的:

if (a < 0 || a >= logicalSize) {...}

true並拋出異常。

我建議您弄清楚logicalSize的作用(對我而言)是ArrayList中實際對象的數量。 請注意,在測試中,您尚未將任何東西放入數組中。 即使您有一個可以容納5個對象的內部數組,在add(...) ,調用get(0)引發異常。

你有一個類的靜態變量

private static Object[] array 

然后在構造函數中創建一個局部變量數組;

即這樣做

Object[] array 

再次將為該函數創建一個局部變量。

由於您再次聲明了Object [],因此它將成為構造函數范圍內的變量。

暫無
暫無

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

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