有谁能告诉我构造函数和零参数构造函数之间的区别(概念上)是什么?示例:
此实现将如何影响程序
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;
}
编辑:请忽略参数数量......
答案 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()
。
然后,由于retired
和address
在两个构造函数中的设置方式相同,所以在它们的声明中初始化它们:
private boolean retired = false;
private String address = null; // If it's a String; it could be its own object type.
然后,由于false
和null
是实例变量初始化的默认值,因此将这两行替换为:
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)
答案 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;
}'