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

Java 初始化成员变量而不是实例变量,java,arraylist,Java,Arraylist,我遇到了一个名为arrayList的类的问题,该类表示对象列表,并支持通过数字位置索引随机访问其对象 在解决了toString()和size()的问题后,我遇到了一个问题,我没有初始化我的成员数组;仅初始化区域设置变量。然而,我的印象是,我所做的修改应该解决了这个问题 public Object get(int a) { if (a < 0 || a >= logicalSize) { throw new IndexOutOfBoundsException("

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

非常感谢,Packerfan504

您有一个类静态变量

private static Object[] array 
在构造函数中,您正在创建一个局部变量数组

我在做这件事

Object[] array 
将再次为该函数创建一个局部变量


由于您再次声明了它Object[],它将成为构造函数范围内的一个变量

首先,类名应该遵循Java约定。它应该以大写字母开头,用大写字母写

数组
当然应该而不是
静态
。当您声明一个成员
static
时,意味着它在所有实例之间共享

在构造函数中,设置局部变量而不是成员

 // remove Object[] in front
 array = new Object[]{null,null,null,null,null};
数组中的构造函数不设置成员
数组

public arrayList(Object[] array)
{
   logicalSize = array.length;
   //Object[] copyArray = array;
   this.array = array;
}
这不会进行任何复制:成员引用作为参数传递的数组。如果您想要某种“复制构造函数”,您需要实际实例化一个新数组并复制每个元素。或使用

您应该使用正确的签名覆盖
java.langObject
中的
toString()
方法(为什么要将数组作为参数传递?)。Java中的所有类都隐式扩展
Object
class

您应该区分
Object[]
数组大小(即需要增加数组之前的潜在插槽数量)和反映数组中元素数量的逻辑大小。这里您将逻辑大小设置为array.length,这只是冗余信息


编辑其他建议

在以size为参数的构造函数中,创建(logicalSize-1)的数组。为什么?

在默认构造函数中,不初始化
logicalSize
,然后将其设置为
0
。这对我来说没关系,但是,为什么在构造函数中将其设置为
i
,并使用大小作为参数? 那么在
a1.get(0)
中:

如果(a<0 | | a>=logicalSize){…}
true
并引发异常


我建议您澄清
logicalSize
的角色,它(对我来说)是
ArrayList
中实际对象的数量。请注意,在测试中,您还没有在数组中放入任何内容。即使您有一个可以容纳5个对象的内部数组,在
添加(…)
某些内容之前,调用
get(0)
也会引发异常

为什么
array
是静态的?另外,这是令人困惑的,因为类名应该大写。static被删除,类名被大写,但一些问题仍然存在。更多问题请参见下文的@AbbéRésinas答案。我仍然感到困惑。我从变量中删除了静态部分,但它仍然提供相同的错误。它正在从公共变为私人。我如何使它不再是一个纯粹的局部变量?我把它改为
private int logicalSize;私有对象[]数组=新对象[5];私有对象[]原件;私有对象删除元素;public ArrayList(){array=new Object[5];}
我的代码的更新版本仍然没有解决默认构造函数的问题,但是解决了ArrayList(int i)构造函数的问题。我不确定该如何纠正这一点。新代码:好的,我看到几个pbs。我将对我的答案进行编辑。编辑后:get(0)是否应返回空值?我的印象是它会带来一个null而不会引发异常。正如我在编辑中所说的,在您的测试中,
logicalSize
等于0,那么get(0)的条件为true,这将引发异常。
public arrayList(Object[] array)
{
   logicalSize = array.length;
   //Object[] copyArray = array;
   this.array = array;
}
if (a < 0 || a >= logicalSize) {...}