域的初始化方法一般有3种:
1. initializer:在域的声明中赋一个默认值
2. constructor:在构造器中设置值
3. initialization block:在初始化块中设置值其中关于构造器的使用,有一个耐人寻味的地方:
假设有这样一个Employee类:class Employee
{
private int staffId;
private static int nextId = 0;
private String name = "<unnamed>";
private String address = null;
Employee()
{
staffId = nextId++;
}
}无参构造器肯定是首先必须出现的,这个没有疑问,可是一个参数的构造器和两个参数的构造器,哪一个先出来比较好呢?或者换个说法,是让两个参数的构造器调用一个参数的构造器好一些?还是让一个参数的构造器调用两个参数的构造器好一些呢?//情形1:在两个参数构造器中调用一个参数的构造器:
Employee(String name)
{
this();
this.name = name;
}
Employee(String name, String address)
{
this(name); //两参数构造器内部调用一参构造器
this.address = address;
}//情形2:在一个参数构造器中调用两个参数的构造器
Employee(String name, String address)
{
this();
this.name = name;
this.address = address;
}
Employee(String name)
{
this(name, null);//一参构造器内部调用两参数构造器
}
}以上两种写法,哪一种更符合Java规范,哪一种效率更高呢?
1. initializer:在域的声明中赋一个默认值
2. constructor:在构造器中设置值
3. initialization block:在初始化块中设置值其中关于构造器的使用,有一个耐人寻味的地方:
假设有这样一个Employee类:class Employee
{
private int staffId;
private static int nextId = 0;
private String name = "<unnamed>";
private String address = null;
Employee()
{
staffId = nextId++;
}
}无参构造器肯定是首先必须出现的,这个没有疑问,可是一个参数的构造器和两个参数的构造器,哪一个先出来比较好呢?或者换个说法,是让两个参数的构造器调用一个参数的构造器好一些?还是让一个参数的构造器调用两个参数的构造器好一些呢?//情形1:在两个参数构造器中调用一个参数的构造器:
Employee(String name)
{
this();
this.name = name;
}
Employee(String name, String address)
{
this(name); //两参数构造器内部调用一参构造器
this.address = address;
}//情形2:在一个参数构造器中调用两个参数的构造器
Employee(String name, String address)
{
this();
this.name = name;
this.address = address;
}
Employee(String name)
{
this(name, null);//一参构造器内部调用两参数构造器
}
}以上两种写法,哪一种更符合Java规范,哪一种效率更高呢?
{
private int staffId;
private static int nextId = 0;
private String name = "<unnamed>";
private String address = null;
//放在块里
{
nextId++;
}
Employee()
{
}
Employee(String name)
{
this.name = name;
}
Employee(String name, String address)
{
this(name); //两参数构造器内部调用一参构造器
this.address = address;
}
}
this(null, null);
}Employee(String name) {
this(name, null);
}Employee(String name, String address) {
staffId = nextId++;
this.name = name;
this.address = address;
}也就是说,让一个带有完整参数列表的构造器执行所有实际的工作,其他的构造器都调用这个构造器。这样的话,如果需要更改初始化逻辑,只需要改最后一个构造器内代码即可。这种情况下,其他的构造器其实仅仅是提供给用户的接口而已。