我不了解复制构造函数的详细工作原理

时间:2019-09-23 16:19:12

标签: java copy-constructor

此代码的目的是什么?

public Fraction(Fraction other) {
    num = other.num; 
    denom = other.denom; 
}

如果您有这样的构造函数:

public Fraction(int n, int d) {
    num = n;
    denom = d;
}

为什么必须将other.num初始化为num并将other.denom初始化为denom。复制构造函数的语法是什么?目的是什么?

4 个答案:

答案 0 :(得分:4)

使用起来更加方便。


如果您有一个简单的构造函数,例如:

public Fraction(int n, int d) {
    num = n;
    denom = d;
}

您可以使用以下代码复制原始实例:

Fraction copy = new Fraction(original.num, original.denom);

使用复制构造函数时,请执行以下调用:

Fraction copy = new Fraction(original);

如果您有许多参数,这会更加方便。更改构造函数或对象的自变量是什么?如果没有复制构造函数,则必须更改所有此类调用。


M中值得注意的事实。普罗霍罗夫的评论:

  

复制构造函数没有特殊的语法,它们只是   实现参数化构造函数的逻辑样式。

答案 1 :(得分:2)

如果您只是输入

public Fraction(Fraction other) {
}

Java不会简单地猜测您要将other的值复制到新对象中。 Java不会自动为您初始化变量。为了使其成为复制构造函数,您仍然必须手动键入将字段从other复制到要创建的对象的代码。像这样:

public Fraction(Fraction other) {
    num = other.num; 
    denom = other.denom; 
}

构造函数会创建一个新的Fraction,但是您在其中键入的代码会手动执行“复制”,从而使其成为“复制构造函数”并允许您执行

Fraction a = Fraction(4, 20);
Fraction b = new Fraction(a); 
// b has the same values as a but is a different object

当然,如果您已经有另一个构造函数,那么制作副本构造函数的一种较短方法是

public Fraction(int n, int d) {
    num = n; 
    denom = d; 
}

public Fraction(Fraction other) {
    this(other.num, other.denom);
}

答案 2 :(得分:1)

使用复制构造函数而不是构造函数传递所有参数有两个很好的理由:

  1. 当我们有一个具有许多属性的复杂对象时,使用复制构造函数会很方便
  2. 如果我们在现有类中添加一个属性,那么我们只需更改复制构造函数即可将此新属性考虑在内,而不必更改每次出现的其他构造函数

答案 3 :(得分:1)

如果您拥有Fraction对象的实例,例如:

Fraction fr = new Fraction(1, 2); //represents 1/2

当然,您可以通过将其分配给新变量来复制

Fraction copy = fr;

但是现在frcopy都指向同一个对象(在内存中位于同一位置)。如果由于某种原因copy更改为1/3,fr也将更改。 有时,您需要原始对象的全新副本。那是真正方便编写的地方:

Fraction copy = new Fraction(fr);

现在,您可以独立操作copyfr,而不必担心其中的任何不必要的更改。

您可以阅读this教程,以获得有关该主题的更多深入信息。