进行相关陈述之前,先来简单地复习下Java中构造器的主要作用。
我们知道,Java中构造器的一个主要作用是在创建对象时对正在创建的对象执行初始化工作。构造器是创建Java对象的途径,那自然而然地有人产生疑问:是不是构造器完全负责创建Java对象呢?
答案是否定的。
那么,在构造器执行之前,系统都做了些什么呢?系统会先为对象分配内存空间,然后为这个对象执行默认初始化(把所有基本类型的Field设为0或false,把所有引用类型的Field设为null)。换句话说,在系统开始执行构造器的执行体之前,系统已经创建了一个对象,只是这个对象暂时还不能被外部程序访问,只能在构造器中通过this来引用(this代表本构造器正在初始化的对象)。程序员通过new调用构造器(或者在构造器中调用另一个重载的构造器)时,系统已经做好了上面的工作。
然后呢,系统开始执行构造器的执行体,如果此时的被调用的构造器(可能存在重载)的执行体为空,那么,该构造器执行之后,这个新创建的对象的Field的值只能是系统默认的值了。所以,在这里,通过在构造器中添加初始化对象的代码来达到初始化对象的目的就很容易理解了。也就是说,要想达到对象创建之后对象的Field相关属性按照自已的意愿来填充,就必须将初始化代码写在相应的构造器中,从这个角度理解构造器的主要作用是创建对象时执行初始化就顺其自然,不那么难于理解了。
接下来,问题就又来了---------既然构造器是在对象创建之时被系统执行,也就是说,对于一个特定的对象,在它的整个生命周期内,以构造器的方式进行的初始化工作只能进行一次且必然会进行一次!同时,程序也不无可能地要求在对象的整个生命周期的任何一个时间点上对对象进行初始化。那么,我们该如何处理这个问题呢?
文章到这里,才回到主题。
下面的代码一定程度上解决了这一问题,肯定也不排除存在其他的方式来达到同样的目的,本人只在这里起个抛砖引玉的作用吧。
public class Student {
public String name;
public String sex;
public Student(String name, String sex) {
this.init(name, sex);
}
public void init(String a, String b) {
name = a;
sex = b;
}
public static void main(String[] args) {
Student stu = new Student("小明", "男");
System.out.println("构造器执行初始化后,学生姓名为:" + stu.name + ",性别为:" + stu.sex);
stu.init("小红", "女");
System.out.println("再次执行初始化后,学生姓名为:" + stu.name + ",性别为:" + stu.sex);
}
}
运行结果: