Java拷贝构造函数
最后修改:2020年5月3日
1.介绍
Java类中的复制构造函数是构造函数那使用同一个Java类的另一个对象创建一个对象。
当我们想要复制一个有几个字段的复杂对象时,或者当我们想要创建一个深拷贝现有对象的。
2.如何创建一个复制构造函数
要创建复制构造函数,首先可以声明一个以相同类型的对象作为形参的构造函数:
public class Employee {private int id;私人字符串名称;public Employee(Employee Employee) {}}
然后,将输入对象的每个字段复制到新实例中:
public class Employee {private int id;私人字符串名称;public Employee() {this。id = employee.id;this.name = employee.name;}}
我们这里有一个浅拷贝,这很好,因为我们所有的领域- anint和一个字符串在这种情况下,两者都是原始类型或不可变类型。
如果Java类有可变字段,那么我们可以创建一个深拷贝在它的复制构造函数中。使用deep copy,新创建的对象独立于原始对象,因为我们为每个可变对象创建了不同的副本:
public class Employee {private int id;私人字符串名称;私人约会startDate可以;public Employee() {this。id = employee.id;this.name = employee.name;这一点。startDate = new Date(employee.startDate.getTime());}}
3.复制构造函数vs.克隆
在Java中,我们也可以使用克隆方法从现有对象创建对象。但是,复制构造函数比克隆方法:
- 复制构造函数更容易实现。我们不需要实现可克隆接口和处理CloneNotSupportedException。
- 的克隆方法返回一个常规对象参考。因此,我们需要将其键入适当的类型。
- 我们不能给a赋值最后字段克隆方法。但是,我们可以在复制构造函数中这样做。
4.继承问题
Java中的复制构造函数不能被子类继承。因此,如果我们试图从父类引用初始化子对象,我们将面临一个选角问题当使用复制构造函数克隆它时。
为了说明这个问题,让我们首先创建员工以及它的复制构造函数:
public class Manager extends Employee {private List;/ /……public constructor () {super();id、manager.name manager.startDate);这一点。directReports = directReports.stream() .collect(collators . tolist ());}}
然后,我们声明an员工变量,并使用经理构造函数:
员工源=新经理(1,“Baeldung Manager”,Start金宝搏188体育date,DirectReports);
因为引用类型是员工,我们必须把它投到经理类型的复制构造函数,以便使用经理类:
Employee clone = new Manager((Manager) source);
我们可能会classcastException.在运行时,输入对象不是经理类。
避免在副本构造函数中投射的一种方法是为两个类创建一个新的可继承方法:
public class Employee {public Employee copy() {return new Employee(this);}} public class Manager extends Employee {@Override public Employee copy() {return new Manager(this);}}
在每个类方法中,我们用的输入调用它的复制构造函数这对象。这样,我们就可以保证生成的对象等于调用方对象:
Employee clone = source.copy();
5.结论
在本教程中,我们通过一些代码示例演示了如何创建复制构造函数。此外,我们讨论了为什么我们应该避免克隆方法。
当我们使用复制构造函数克隆引用类型为父类的子类对象时,复制构造函数有一个强制转换问题。我们为这个问题提供了一个解决方案。
一如既往,可以使用教程的源代码在github上。