5. 对象的构造及初始化
5.1 如何初始化对象
通过前面知识点的学习知道,在 Java 方法内部定义一个局部变量时,必须要初始化,否则会编译失败:
publicstaticvoidmain(String[] args) { inta; System.out.println(a); } // Error:(26, 28) java: 可能尚未初始化变量a
publicstaticvoidmain(String[] args) { Dated=newDate(); d.printDate(); d.setDate(2021,6,9); d.printDate(); } // 代码可以正常通过编译
需要调用之前写的 SetDate 方法才可以将具体的日期设置到对象中。 通过上述例子发现两个问题:
1. 每次对象创建好后调用 SetDate 方法设置具体日期,比较麻烦,那对象该如何初始化?
2. 局部变量必须要初始化才能使用,为什么字段声明之后没有给值依然可以使用?
5.2 构造方法
5.2.1 概念
构造方法(也称为构造器)是一个特殊的成员方法,名字必须与类名相同,在创建对象时,由编译器自动调用,并且 在整个对象的生命周期内只调用一次,举个例子:
publicDate(intyear, intmonth, intday){ this.year=year; this.month=month; this.day=day; System.out.println("Date(int,int,int)方法被调用了"); }
注意:构造方法的作用就是对对象中的成员进行初始化,并不负责给对象开辟空间。
5.2.2 特性
1. 名字必须与类名相同
2. 没有返回值类型,设置为void也不行
3. 创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次(相当于人的出生,每个人只能出生一次)
4. 构造方法可以重载(用户根据自己的需求提供不同参数的构造方法)
举个例子:
classDateUtil { publicintyear; publicintmonth; publicintday; publicDateUtil() { System.out.println("调用了该方法"); } publicDateUtil(intyear, intmonth, intday) { this.year=year; this.month=month; this.day=day; System.out.println("调用了3个参数的构造方法!"); } /*public void setDate(int year, int month, int day) {this.year = year;this.month = month;this.day = day;}*/publicvoidshow() { System.out.println("年:"+year+"月:"+month+"日:"+day); } } publicclassTest_2 { publicstaticvoidmain(String[] args) { DateUtildateUtil=newDateUtil(2022, 11, 11); dateUtil.show(); } }
这里我们通过构造方法直接给成员变量初始化,而并没有调用setDate这个方法,这就是构造方法!
我们也可以通过this引用去调用构造方法:
classDateUtil { publicintyear; publicintmonth; publicintday; publicDateUtil() { this(2022,11,11); System.out.println("调用了该方法"); } publicDateUtil(intyear, intmonth, intday) { this.year=year; this.month=month; this.day=day; System.out.println("调用了3个参数的构造方法!"); } /*public void setDate(int year, int month, int day) {this.year = year;this.month = month;this.day = day;}*/publicvoidshow() { System.out.println("年:"+year+"月:"+month+"日:"+day); } } publicclassTest_2 { publicstaticvoidmain(String[] args) { DateUtildateUtil=newDateUtil(); dateUtil.show(); } }
这里可以发现,我们在主函数中的DateUtil()方法中并没有传参,而是通过构造方法,用this给成员变量初始化,这样输出也能达到预期的结果!
注:当通过this去调用构造方法时,this要放在第一行,否则代码编译不通过
5.3 默认初始化
如果在类里的成员变量没有赋值,编译器默认会赋一个初始值:
classDateUtil { publicintyear; publicbooleanmonth; publicfloatday; publicDateUtil() { System.out.println("调用了该方法"); } publicDateUtil(intyear, booleanmonth, floatday) { this.year=year; this.month=month; this.day=day; System.out.println("调用了3个参数的构造方法!"); } /*public void setDate(int year, int month, int day) {this.year = year;this.month = month;this.day = day;}*/publicvoidshow() { System.out.println("年:"+year+"月:"+month+"日:"+day); } } publicclassTest_2 { publicstaticvoidmain(String[] args) { DateUtildateUtil=newDateUtil(); //dateUtil.show();System.out.println(dateUtil.year); System.out.println(dateUtil.month); System.out.println(dateUtil.day); }
运行如下:
这里有张表供大家参考:\
6.总结
到这儿今天的主题就和大家介绍完了,小编也是刚刚学习java的小白,后续还会给大家分享Java的相关知识,一起学习,一起进步,如对上文有意见或者有错误,还请大佬们斧正,觉得有帮助的童鞋们,创作不易,蟹蟹三连!