如何在构造函数中初始化数组?

时间:2014-08-18 12:37:00

标签: java arrays constructor

让我们说我们有这两种不同的构造函数。     第一个和第二个之间有什么不同。     怎么办呢?请解释一下差异!     (我知道你不能把这两个构造函数放在同一个类中,这只是为了表明我的意思。

public class StackOverFlow {

private int[] x; // instance variable


StackOverFlow(int[] x) { // constructor
    this.x=x;     
}

StackOverFlow(int[] x) { // constructor

    this.x = new int[x.length];
    for(int k=0 ; k < x.length; k++) {
        this.x[k]=x[k];
    }                  
}         

3 个答案:

答案 0 :(得分:2)

第一个构造函数将现有int数组的引用分配给成员变量。构造函数的调用者稍后可以更改数组,并且更改将反映在实例中。

第二个构造函数复制数组,因此稍后传递的数组中的更改不会更改存储在实例中的副本。

int[] intArray = new intArray {1,2,3};

StackOverFlow so1 = new StackOverFlow(intArray); // assume we are using the first constructor 

intArray[1]=5; // changes the array stored in `so1` object

StackOverFlow so2 = new StackOverFlow(intArray); // assume we are using the second constructor

intArray[1]=8; // doesn't change the array stored in `so2` object

答案 1 :(得分:0)

在第一种情况下,您告诉实例变量引用给定的x,因此当您更改其中一个变量中的数据时,这些更改也会影响第二个变量。

在第二种情况下,您创建了一个对象的副本,因此您传递给构造函数的实例变量和变量将需要在您的其他代码中彼此独立。

答案 2 :(得分:-1)

由于两个构造函数都接收到相同类型的参数,因此会出现歧义问题,因此无效。所以当你尝试创建一个实例时:

StackOverflow instance = new StackOverflow(new int[]{});

无法知道应该调用哪个构造函数。

您需要确定哪种行为对您有利。

如果你想从初始化数组中设置数组,我建议使用第二个构造函数并创建一个setter方法:

public class StackOverFlow {

    private int[] x; // instance variable

    StackOverFlow(int[] x) { // conctructor    
        this.x = new int[x.length];
        for(int k=0 ; k < x.length; k++) {
                this.x[k]=x[k];
            }
    }

    public void setTheArray(int[] x) {
        this.x = x;
    }
}