复制构造函数中的代码有什么问题?

时间:2016-03-17 13:14:36

标签: java

数字等级

class Number 
{
Scanner input = new Scanner(System.in);
int[] arr;
int n;
String name;
Number()
{

    System.out.print("Enter List Size :");
    this.n = input.nextInt();
    this.arr = new int[n];
    for(int i =0;i<n;i++)
    {
        System.out.print("Enter a Number :");
        this.arr[i] = input.nextInt();
    }
}

Number(Number O)
{
    this.n = O.n;
    this.arr = O.arr;

}
void Read_Number()
{
    for(int i =0;i<n;i++)
    {
        System.out.print("Enter a Number :");
        arr[i] = input.nextInt();
    }
}}

创建复制构造函数后,如果我在对象O2中进行了更改,那么在对象O1中也会发生类似的更改。

public class MyList {


public static void main(String[] args) 
{       Scanner input = new Scanner(System.in);

        Number O1 = new Number();
        Number O2 = new Number(O1);
           }
}

为什么和什么是解决方案?

2 个答案:

答案 0 :(得分:3)

您的复制构造函数不会创建原始类的数组成员的副本。

你需要复制一份:

Number(Number O)
{
    this.n = O.n;
    this.arr = Arrays.copyOf(O.arr,O.arr.length);
}

当您只复制对原始数组的引用时,两个Number实例引用同一个数组,其中一个实例的数组中的更改将反映在另一个实例中。

答案 1 :(得分:2)

int []是参考数据类型。如果将其复制到新对象,则复制引用,而不是它指向的对象。这将解决您的问题:

Number(Number O)
{
    this.n = O.n;
    this.arr = Arrays.copyOf(O.arr, O.arr.length);

}