如何构建接收另一个点(x,y)并复制其值的复制构造函数?
我决定签名:public Point1 (Point1 other)
,但我不知道该写些什么…
Point类看起来像:
public class Point1
{
private int _x , _y;
public Point1 (Point1 other)
{
...
...
}
//other more constructors here...
}
我试过了:
public Point1 (Point1 other)
{
_x = other._x ;
_y = other._y;
}
但我几乎可以肯定我会做得更好。
n
不,您的尝试
public Point1(Point1 other)
{
_x = other._x ;
_y = other._y;
}
绝对没问题…(我已经更正了参数类型。)
我很想进行make _x
和_y
final的操作,并且使该类final的操作,但这是因为我喜欢不可变的类型。其他人肯定有不同意见:)
在继承层次结构上进行克隆比较棘手-层次结构中的每个类都必须具有一个相关的构造函数,将其提供的任何参数传递给超类构造函数,然后仅复制其自己的字段。例如:
public class Point2 extends Point1
{
private int _z;
public Point2(Point2 other)
{
super(other);
this._z = other._z;
}
}
在实现方面这还不错,但是如果您要忠实地克隆a Point2
,则需要 知道 它是a Point2
才能调用正确的构造函数。
实现Cloneable
使这一过程变得更简单,但是还有其他事情要考虑…基本上,克隆对象并不像看起来的那么简单:)(我确定在Effective
Java中有一个条目可以实现) 。如果您没有副本,请立即购买。)
问题内容: 我实现了此处描述的副本构造函数。但是问题仍然是,当我更新时,会将相同的更新应用于。所以,我不明白我的代码有什么问题? 问题答案: 在复制构造函数中,您只是在进行浅表复制,而您需要进行深表复制: 在这里,您仍在复制的引用,该引用仍指向same 。您也应该对其进行修改以创建列表的副本。可能还需要像下面这样在arraylist中创建元素的副本:
此程序成功编译并显示以下输出。 问题 a)我不明白为什么alpha的构造函数没有首先被执行。 我相信“super()”会首先被每个子构造函数隐式调用...对吗?。 b)如果beta的构造函数已经执行,那么为什么打印“5”?(输出中的第二行) 第三行我有点理解(即alpha自己的变量将显示出来,因为还没有对“a”实例变量进行强制转换)
我想知道以下解决方案之间的区别是什么,为什么使用解决方案2?有什么好处吗? 解决方案一: 解决方案2:
本文向大家介绍Java构造函数,包括了Java构造函数的使用技巧和注意事项,需要的朋友参考一下 构造函数与方法相似,但在以下方面有所不同。 它们没有任何返回类型。 构造函数的名称与类的名称相同。 每个类都有一个构造函数。如果我们未为类明确编写构造函数,则Java编译器将为该类建立默认构造函数。 每次创建一个新对象时,将至少调用一个构造函数。 一个类可以具有多个构造函数。 示例 输出结果
可能的重复: 为什么this()和super()必须是构造函数中的第一条语句? 我想要一个在Java的建筑链。例如,对于第一个构造函数,我有一个字符串作为参数,并在从参数字符串创建对象时调用第二个构造函数。 但是,我得到了一个错误“构造函数调用必须是构造函数中的第一条语句”错误。 我制作了一个在两个构造函数之间共享的公共代码,但我不确定这是绕过这个问题的唯一解决方案。 为什么Java要求构造函数调
可能的重复: 为什么this()和super()必须是构造函数中的第一条语句? 为什么子类构造函数必须显式调用超类构造函数?这是什么原因呢?