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