繁体   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