我看到了一个尝试在Java中解释继承的示例。 Employee类是基类,它有三个实例变量和三个构造函数。它如下:
public class Employee{
private String name;
private int id;
public Employee(){
name = " No Name!";
id = 00100;
}
public Employee(String n, int i){
name = n;
id = i;
}
public Employee (Employee originalObject){
name = originalObject.name;
id = originalObject.id;
}
我的问题是:第三个构造函数有什么意义?以及它如何接受我们仍在处理的类的相同类型Employee
的参数?该程序已经有一个空的构造函数,另一个为name
传递String int
和id
的{{1}},为什么还有一个额外的构造函数比前两个构造函数更多?
答案 0 :(得分:5)
看起来第三个构造函数用于创建现有Employee
对象的副本。
你可能会做同样的事情:
new Employee(orig.getName(), orig.getId());
但是假设每个属性都有“get”方法。实现这样的构造函数更容易,然后调用:
new Employee(orig);
然后,如果需要更改Employee
的属性,则只需在一个位置更改复制构造函数。
答案 1 :(得分:1)
这称为复制构造函数,此类构造函数的关键在于您现在可以自由修改此新Employee
对象而不会影响原始对象,反之亦然。
你是正确的new Employee(other)
等同于new Employee(other.getName(), other.getId())
,但复制构造函数版本要短得多,使得意图更加清晰 - 对于更复杂的对象,它们不会暴露所有的状态,复制构造函数可以访问另一个构造函数不会的细节。此外,如果您向Employee
添加字段,则无需更改构造函数的所有调用方 - 使代码更易于维护。
答案 2 :(得分:1)
正如您所说,第三个构造函数不是必需的,但它是为了方便本类的任何客户端而提供的。
写起来更简洁
new Employee(employee)
而不是单独传递所有参数。
可能还需要的字段是私有字段,因此创建新Employee
实例的代码可能无法访问。您的类是一个很好的示例,因为它没有公开方法getName()
和getId()
来公开公开这些属性。
最后,传递该类的另一个实例使读者清楚我们正在创建一个新类,即原始副本或副本。能够明确表达这一意图使维护变得更容易。
答案 3 :(得分:1)
它被称为copy constructor(该文章适用于C ++,但复制构造函数是一般概念)。
答案 4 :(得分:1)
为方便起见,它被称为“复制构造函数”,其中通过复制已存在的Employee实例的属性来创建Employee实例。
答案 5 :(得分:0)
这是复制构造函数 - 当我们需要创建实例副本时,clone()
的首选替代方法。