构造函数和零参数构造函数(Java)之间的区别

时间:2013-03-19 01:33:42

标签: java oop constructor

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

此实现将如何影响程序

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

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

7 个答案:

答案 0 :(得分:6)

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

只有在没有构造函数的情况下才会创建默认构造函数。如果为类定义任何构造函数,则不会自动创建默认构造函数。

  

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

没有区别。

答案 1 :(得分: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变量。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

对于第一个构造函数,只要您想要实例化Person,它就会始终以构造函数中定义的值开头。您将不得不使用setter来修改它。

对于第二个构造函数,只要您想要实例化Person,就必须通过适当的参数。这意味着您可以创建对象,而无需使用setter稍后更改该值。

答案 4 :(得分:0)

  1. 如果您没有定义构造函数,默认情况下将生成默认构造函数(没有参数)。
  2. 如果您有任何用户定义的构造函数,则根本不会生成默认构造函数。
  3. 无论如何,除非你的类是实用类,否则你需要一个构造函数。

答案 5 :(得分:0)

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

没有参数的构造函数对使用反射填充对象属性的工具特别有用。默认的no-arg构造函数用于构造对象,然后通过匹配其setter(aka mutators)中使用的名称来填充其属性。

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

答案 6 :(得分: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;
}'
相关问题