1

谁能告诉我构造函数和零参数构造函数之间的区别(概念上)是什么?例子:

此实施将如何影响程序

public Person() {
firstName = "UNKNOWN";
lastName = "UNKNOWN";
gender = '?';
retired = false;
age = 0;
address = null;
}

相比说......这个:

public Person(String f, String l, int a, char g) {
firstName = f;
lastName = l;
age = a;
gender = g;
retired = false;
address = null;
}

编辑:请忽略参数的数量...

4

7 回答 7

6

如果您没有为类定义构造函数,则编译器会自动创建默认的无参数构造函数。默认构造函数调用默认父构造函数 (super()) 并将所有实例变量初始化为默认值(数字类型为零,对象引用为 null,布尔值为 false)。

仅当没有构造函数时才会创建默认构造函数。如果为类定义任何构造函数,则不会自动创建默认构造函数。

谁能告诉我构造函数和零参数构造函数之间的区别(概念上)是什么?

没有不同。

于 2013-03-19T01:41:06.270 回答
2

此外,一种好的风格是只有一个构造函数来完成所有实际工作,即使你有多个构造函数。术语指定构造函数来自Objective-C,但它仍然是一个好主意。假设你这样写:

public Person(String f, String l, int a, char g) {
        // Use more expressive argument names.
    firstName = f;
    lastName = l;
    age = a;
    gender = g;
    retired = false;
    address = null;
}

然后,将您的无参数构造函数重写为

public Person() {
    this(null, null, 0, '?');
        // Invoke the designated constructor with those arguments.
    retired = false;
    address = null;
}

如果构造函数的第一条语句是this(...),则构造函数正在调用该类的其他构造函数之一。类似地,如果构造函数的第一条语句是super(...),则调用父类的构造函数。如果两者都不做,super()则假设。

然后,由于retiredaddress在两个构造函数中的设置方式相同,因此在它们的声明中初始化它们:

private boolean retired = false;
private String address = null;  // If it's a String; it could be its own object type.

然后,因为falsenull是实例变量初始化的默认值,请将这两行替换为:

private boolean retired;
private String address;

稍后,您可以添加错误检查。例如,人们没有负年龄,所以插入语句

if (a < 0) {
    throw new IllegalArgumentException("A Person cannot have a negative age: "
       + a);
}

在指定构造函数的开头会很有用。这样,您只需执行一次。

当您了解 Java 枚举时,您可以通过编写以下代码来使您的性别变量更加精确:

// Gender is a grammatical term, Sex is a biological term.
public enum Sex {
    MALE, FEMALE;
}

并使用Sex而不是char你的gender变量。

于 2013-03-19T04:45:53.783 回答
0

当没有定义其他构造函数时,将自动创建一个零参数构造函数。带参数的构造函数用于对象的自定义初始化。

于 2013-03-19T01:37:59.927 回答
0

对于第一个构造函数,只要您想实例化 a Person,它总是以构造函数中定义的值开始。您将不得不使用设置器来修改它。

对于第二个构造函数,任何时候要实例化 a Person,都必须传递适当的参数。这意味着您可以创建对象,而无需稍后使用 setter 更改值。

于 2013-03-19T01:40:12.663 回答
0
  1. 如果不定义构造函数,则默认生成默认构造函数(没有参数)。
  2. 如果您有任何用户定义的构造函数,则根本不会生成默认构造函数。
  3. 无论如何,除非您的类是实用程序类,否则您需要一个构造函数。
于 2013-03-19T01:40:13.757 回答
0

实例化对象时调用构造函数。零参数(或“无参数”)构造函数是不需要参数的构造函数。一个类可以有多个构造函数,每个构造函数都有不同的参数。

不带参数的构造函数对于使用反射来填充对象属性的工具特别有用。默认的无参数构造函数用于构造对象,然后通过匹配其设置器中使用的名称(也称为 mutators)来填充其属性。

带参数的构造函数特别适合创建不可变对象。对象可以在创建时填充一次,然后保证不会更改(假设所有属性同样不可变)。

于 2013-03-19T01:56:55.707 回答
0

首先,如果您没有语句构造函数,则该类可以自动创建构造函数,但此构造函数不是参数,并将所有实例变量初始化为默认值(数字类型为零,对象引用为 null,布尔值为 false), 如下所示:

public Person() {
firstName = null;
lastName = null;
gender = null;
retired = false;
age = 0;
address = null;
}

但你可以像这样覆盖这个构造函数

public Person() {
firstName = "firstName";
lastName = "lastName";
gender = '?';
retired = true;
age = 0;
address = "someAddress";
}

并像这样重载这个构造函数

public Person(String f, String l, int a, char g) {
firstName = f;
lastName = l;
age = a;
gender = g;
retired = false;
address = null;
}'
于 2013-03-19T02:16:52.200 回答