2017-03-09 168 views
0
public class Program { 
    IntegSet i1, i2, i3, i4; 
    i1 = new IntegSet(); 
    i2 = new IntegSet(1,2,5); 
    i3 = new IntegSet(); 
    i4 = new IntegSet(i2); 
} 

我的计划的目的是使整台。Java的拷贝构造函数

public class IntegSet{ 
    private final int MAXALLOWEDSETVALUE=2000; 
    private boolean [] data = new boolean[MAXALLOWEDSETVALUE+1]; 

我有这样的第一个功能,我认为这是好的。

public IntegSet(int... elts) { 
    int index = 0; 
    for(int iteration = 0; iteration < elts.length; iteration++) { 
     index = elts[iteration]; 
     data[index] = true; 
    } 
} 

但对于此功能

public IntegSet(IntegSet source){ 
    this.data = source.data; 
} 

这是一个拷贝构造函数?我对这是如何工作有点困惑。而从这个函数的区别:

public void setTo(IntegSet source){} 

在那里我应该用这个称呼它:

i3.setTo(i3.subtract(i1)) 

谢谢

+3

如果'data'可以修改,你需要'Arrays.copyOf(数据,data.length)'取而代之的是'data'只是一个参考,如果原来的'IntSet'改变了,那么新的也是。另外,我认为你的原始构造函数是错误的。如果我将'{1,3,5}'传递给你的构造函数,你的'IntSet'会设置ints {0,1,2},因为你从'0'循环到'elts.length'。 – Moira

+1

或简单地'this.data = source.data.clone()'。 – Andreas

+0

好吧,我编辑了我原来的构造函数。你也可以解释一下我应该使用Arrays.copyof(data,data.length)还是clone()?我知道我需要有两个函数setTo(IntegSet源)和复制构造函数。复制构造函数是否正确?如果是这样,复制构造函数和setTo有什么区别?谢谢 – Coder117

回答

1

拷贝构造函数是一个对象,允许你构造制作一个现有对象的副本。

我想你可能在原来的问题一个错字,但我猜你是问:

public IntegSet(IntegSet source){ 
    this.data = source.data; 
} 

是拷贝构造函数。

拷贝构造函数和 公共无效setTo(INTSET源)之间的差异{}

是您setTo功能其实并没有对你的源输入参数任何东西。它根本不创建新的对象。它甚至不会将引用分配给调用对象。

I3 = I1;

这将设置I1等于I3的参考的参考。 到i3的数据所做的任何更改现在会影响I1也,反之亦然。

I3 =新IntegSet(I1);

这将产生使用拷贝构造i1的副本,并允许在每个对象(I1和I3)的数据成员的改变无关。

在拷贝构造函数的内部代码应该使用数组克隆功能,如:

this.data = source.data.clone(); 
+0

谢谢,我还没有真正编码我的setTo函数。如果我想要它与i3.setTo(i3。减(i1))我怎么能开始编码? – Coder117

+0

setTo函数可以实现等效于复制构造函数。 public void setTo(IntegSet source){this.data = source.data.clone(); }在没有getter的情况下访问“data”实例成员是不好的做法(因为您将“data”设置为private),所以您可能希望实现返回类型为boolean [] – user681574

+0

的“getData”函数谢谢你,他们都是一样的,但我需要2个不同的功能,因为这两个表达是不同的? 'i3.setTo(i3.subtract(i1))vs'i4 = new IntegSet(i2);' – Coder117