初始化成员变量而不是实例变量

时间:2015-03-27 16:41:48

标签: java arraylist

我遇到了一个名为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

2 个答案:

答案 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 [],它将成为构造函数范围内的变量。