我遇到了一个名为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
答案 0 :(得分:1)
首先,您应该遵循类名称的Java约定。它应该以大写字母开头并转到CamelCase。
array
肯定不为static
。声明成员static
时,表示它在所有实例之间共享
在构造函数中,您设置 local 变量而不是成员。
// 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()
。
您应该使用正确的签名从toString()
覆盖 java.langObject
方法(为什么将数组作为参数传递?)。 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)
也应该抛出异常。
答案 1 :(得分:0)
你有一个类静态变量
private static Object[] array
并在构造函数中创建一个局部变量数组;
即这样做
Object[] array
将再次为该函数创建局部变量。
因为你再次将它声明为Object [],它将成为构造函数范围内的变量。