[英]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.