Java构造函数链接

时间:2013-07-14 15:02:11

标签: java constructor-chaining

您好我刚刚学习Java中的构造函数链接并且有一些问题......

  1. 首先,有人可以解释我什么时候需要使用它吗?在我的头脑中,我真的想不到情况。

  2. 在这个例子中,在没有参数的构造函数中,我调用了另一个构造函数。如何访问这个新的“James Bond”对象以备将来使用?

    import java.util.*;
    
    class Employee
    {   
        private String name;
        private double salary;
    
        public Employee()
        {
            this("James Bond", 34000);
        }
    
        public Employee(String n, double s)
        {
            name = n;
            salary = s;
        }
    
        public String getName()
        {
            return name;
        }
    
        public double getSalary()
        {
            return salary;
        }
    
        public static void main(String[] args)
        {
            Employee a = new Employee();
        }
    }
    

5 个答案:

答案 0 :(得分:5)

实际上我认为链式构造函数最常见的用法是构造函数不仅仅是设置成员变量。

static int numOfExamples = 0;
public Example(String name, int num)
{
    this.name = name;
    this.num = num;
    numOfExamples++;
    System.out.println("Constructor called.");
    Log.info("Constructor called");
}

public Example()
{
    this("James Bond",3);
}

这样我们就不必编写用于记录和递增静态变量两次的代码,而只需链接构造函数。

答案 1 :(得分:2)

这样的链接构造函数对于避免重复代码很有用,并有助于维护:

public MyClass(int x, double y, String z) {
    // set fields
}

public MyClass() {  // i.e. a constructor that uses default values
    this(42, 4.2, "hello world");  // x is 42, y is 4.2, and z is "hello world"
}

如果我们没有使用链,并且想要在构造x的实例时更改MyClass参数(例如)的处理方式,我们将不得不更改两个构造函数。通过链条,我们只需要更改其中一个。

答案 2 :(得分:1)

1)正如其他人所说,这是代码维护,基本上你的想法是你只需要编写一段代码,这意味着你只需要编辑一次,在编辑方法时没有忽略某些东西的风险两者意外地变得不同。

我个人倾向于使用与您的示例不同的方式。像这样:

Employee() {
    setupStuff();
}

Employee(String name) {
    this();
    this.setName(name);
}

这是一种很好的做事方式,因为可能你的setter比在类中设置成员更复杂。所以基本上它的作用是将空构造函数调用,然后将setter调用到单个方法中,使得使用该类的任何人都更容易。

2)被调用的构造函数根本不会创建不同的对象,它会创建 this 对象。请注意,没有使用new个关键字。基本上你只是在构造函数中调用一个不同的方法,除了该方法恰好也是一个构造函数。

答案 3 :(得分:0)

如何访问这个新的“James Bond”对象以供将来使用?

因为您将名称和工资的值保存为员工类的字段,然后在员工类中可以使用这些字段,而在员工类之外,您可以使用员工类的getter / setter方法

答案 4 :(得分:0)

  1. 每次您希望允许使用默认值构建对象,并且还希望允许使用非默认值创建相同的对象。让我们想象一下DateTime类。您可能希望默认情况下使用当前时间或特定时间初始化它。想象一下Car课程。您可以想象使用Black作为默认颜色或使用特定颜色构建它。这种情况很常见。有关具体示例,请参阅java.util.ArrayListjava.util.Locale

  2. 它存储在name字段中。因此,您可以使用this.namethis是可选的)从对象本身访问它,就像在getName()方法中一样。