传递相同类型的类的参数有什么意义?

时间:2012-02-12 17:48:42

标签: java inheritance constructor

我看到了一个尝试在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 intid的{​​{1}},为什么还有一个额外的构造函数比前两个构造函数更多?

6 个答案:

答案 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 ++,但复制构造函数是一般概念)。

此问题还讨论了difference between shallow and deep copy

答案 4 :(得分:1)

为方便起见,它被称为“复制构造函数”,其中通过复制已存在的Employee实例的属性来创建Employee实例。

答案 5 :(得分:0)

这是复制构造函数 - 当我们需要创建实例副本时,clone()的首选替代方法。