4

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

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

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

    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();
        }
    }
    
4

5 回答 5

7

实际上,我相信链式构造函数最常见的用途是构造函数不仅仅设置成员变量。

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);
}

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

于 2013-07-14T15:25:30.953 回答
4

像这样链接构造函数有助于避免重复代码,并有助于可维护性:

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,我们将不得不更改两个构造函数中的代码。有了链条,我们只需要改变其中一个。

于 2013-07-14T15:07:51.853 回答
1

1)正如其他人所说,它是为了代码维护,基本上是你只写一段代码,这意味着你只需要编辑一次,在编辑你的方法和两个时没有忽略某些东西的风险一不小心就变得不一样了。

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

Employee() {
    setupStuff();
}

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

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

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

于 2013-07-14T15:22:18.180 回答
1
  1. 每次您希望允许构造具有默认值的对象,并且还希望允许创建具有非默认值的相同对象时。让我们想象一个DateTime班级。您可能希望默认使用当前时间或特定时间对其进行初始化。想象一个Car班级。您可以想象使用黑色作为默认颜色或特定颜色来构建它。这种情况很常见。有关具体示例,请参见java.util.ArrayList或。java.util.Locale

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

于 2013-07-14T15:07:15.397 回答
0

如何访问这个新的“詹姆斯邦德”对象以供将来使用?

因为您将姓名和薪水的值保存为员工类的字段,所以在员工类内部您可以使用这些字段,在您的员工类之外您可以使用员工类的 getter/setter 方法

于 2013-07-14T15:06:23.337 回答