Java变量数组长度

时间:2015-04-15 07:34:09

标签: java arrays variables

我在编译java项目时遇到问题,因为数组长度整数(这是一个变量)在我的Object数组中没有正确替换。

import java.util.Arrays;

public class ObjectList {
    private int N;
    private Object[] fractionList = new Object[N];

    public ObjectList(int n){
        this.N = n;
    }

    public int capacity(){
        return this.N;
    }

    public void setN(int n){
    this.N = n;
    }

    public String toString(){
        return Arrays.toString(fractionList);
    }
}

public class FractionDriver {
    public static void main(String[] args){

    // creates the object list, sets N to 4
    ObjectList list = new ObjectList(4);

    System.out.println("The Objectlist has " + list.capacity() + " lines");

    // prints the array
    System.out.println(list.toString());
    }
}

这是编译器输出的内容:

The ObjectList has 4 lines
[]

因此,我无法向我的数组添加任何对象。编译器抛出一个ArrayIndexOutOfBoundsException:0并告诉我数组中没有元素。

如果我选择在对象数组实例变量中替换N,如下所示:

private Object[] fractionList = new Object[4];

编译器很满意并将数组长度设置为4。

我做错了什么?

4 个答案:

答案 0 :(得分:4)

您可以在构造函数中创建数组实例,其长度已知:

private Object[] fractionList;

public ObjectList(int n){
    this.N = n;
    this.fractionList = new Object[n];
}

但是,您可能还希望在更改N的值时重新创建数组:

public void setN(int n){
    this.N = n;
    // consider copying data from the old array to the new array
    this.fractionList = new Object[n];
}

答案 1 :(得分:2)

问题在于行

private Object[] fractionList = new Object[N];

在构造函数之前执行。初始化顺序总是如下:

  1. 如果有超类 - 首先将其初始化
  2. 按外观顺序的静态变量声明和静态初始化程序
  3. 按出现顺序的实例变量声明和实例初始值设定项
  4. 构造函数。
  5. 您希望构造函数(4)中的代码设置数组长度,但数组已在实例变量(3)中创建。

    我建议如下:

    public class ObjectList {
        private int N;
        private Object[] fractionList;
    
        public ObjectList(int n){
            fractionList = new Object[n];
            this.N = n;
        }
    
        public int capacity(){
            return this.N;
        }
    
        public void setN(int n){
            // might want to copy content from old array to new one here
            fractionList = new Object[n];
            this.N = n;
        }
    
        public String toString(){
            return Arrays.toString(fractionList);
        }
    }
    

    如果您想要遵守Java Bean,我还建议您将capacity()方法重命名为getCapacity()

答案 2 :(得分:1)

首先,这不是编译错误。该程序编译正常。问题是数组fractionList在之前被初始化,在设置变量N的情况下调用构造函数的主体。

您可以将初始化移动到构造函数:

private Object[] fractionList;


public ObjectList(int n) {
    this.N = n;
    fractionList = new Object[N];
}

答案 3 :(得分:0)

嗯......简单来说,当Object[] fractionList被初始化时,字段N的值是“不可见的”,因为在调用this.N = n;之前不会设置它的值,与文字编号4不同,后者是编译时常量。

您可以将参数N传递给构造函数以初始化数组。类似的东西:

public ObjectList(int n){
    this.fractionList = new Object[n];
}