对象的构造及初始化
目录
一、如何初始化对象
二、构造方法
1.概念
2.特性
三、默认初始化
四、就地初始化
总结
一、如何初始化对象
在Java方法内部定义一个局部变量的时候,我们知道必须要进行初始化。
public class Test4 {
public static void main(String[] args) {
//未初始化的变量n
int n;
System.out.println(n);//尚未初始化变量n,编译失败
}
}
如果要上述代码通过编译,只需要在使用n之前给它一个初始值即可。
如果要是一个对象,则如下面代码,需要调用之前写的SetDate方法才可以将具体的日期设置到对象中。
class Date{
public int year;
public int mouth;
public int day;
public void setDay(int year,int mouth,int day){
this.year = year;
this.mouth = mouth;
this.day = day;
}
public void printfDate(){
System.out.println(year + "年" + mouth + "月" + day + "日");
}
}
public static void main(String[] args) {
Date d = new Date();
d.printDate();
d.setDate(2023,3,30);
d.printDate();
}
// 代码可以正常通过编译
但大家发现问题没有:
1.每次对象创建好后调用SetDate方法设置具体日期,比较麻烦,那对象该如何初始化?
2. 为什么局部变量必须要初始化才能使用,为什么字段声明之后没有给值依然可以使用?
下面为大家解释。
二、构造方法
1.概念
构造方法是一个特殊的成员方法,名字必须与类名相同,在创建对象时,由编译器自动调用,并且在整个对象的生命周期内只调用一次。
构造方法的作用就是对对象中的成员进行初始化,并不负责给对象开辟空间。
public class Date {
public int year;
public int month;
public int day;
// 构造方法:
// 名字与类名相同,没有返回值类型,设置为void也不行
// 一般情况下使用public修饰
// 在创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次
public Date(int year, int month, int day){
this.year = year;
this.month = month;
this.day = day;
System.out.println("Date(int,int,int)方法被调用了");
}
public void printDate(){
System.out.println(year + "-" + month + "-" + day);
}
public static void main(String[] args) {
// 此处创建了一个Date类型的对象,并没有显式调用构造方法
Date d = new Date(2021,6,9); // 输出Date(int,int,int)方法被调用了
d.printDate(); // 2021-6-9
}
}
2.特性
1. 名字必须与类名相同
2. 没有返回值类型,设置为void也不行
3. 创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次
4. 构造方法可以重载(用户根据自己的需求提供不同参数的构造方法)
public class Date {
public int year;
public int month;
public int day;
// 无参构造方法
public Date(){
this.year = 1900;
this.month = 1;
this.day = 1;
}
// 带有三个参数的构造方法
public Date(int year, int month, int day) {
this.year = year;
this.month = month;
this.day = day;
}
public void printDate(){
System.out.println(year + "-" + month + "-" + day);
}
public static void main(String[] args) {
Date d = new Date();
d.printDate();
}
}
上述两个构造方法:名字相同,参数列表不同,因此构成了方法重载。
注意:
- 类中没有定义任何构造方法,编译器会默认生成一个不带参数的构造方法。
- 构造方法中,可以通过this调用其他构造方法来简化代码
三、默认初始化
在上文中提出的第二个问题:为什么局部变量在使用时必须要初始化,而成员变量可以不用呢?
这是因为关键词new,当你new出一个对象的时候,在程序层面只是一条简单的语句,而在JVM层面会发生很多的事情,例如:
1. 检测对象对应的类是否加载了,如果没有加载则加载
2. 为对象分配内存空间
3. 处理并发安全问题
4. 初始化所分配的空间即:对象空间被申请好之后,对象中包含的成员已经设置好了初始值,比如:
数据类型 默认值 byte 0 int 0 double 0.0 char '\u0000' short 0 long 0L boolean false float 0.0f reference null 5. 设置对象头信息
6. 调用构造方法,给对象中各个成员赋值
四、就地初始化
在声明成员变量时,就直接给出了初始值。
public class Date {
public int year = 1900;
public int month = 1;
public int day = 1;
public Date(){
}
public Date(int year, int month, int day) {
}
public static void main(String[] args) {
Date d1 = new Date(2021,6,9);
Date d2 = new Date();
}
}
总结
为大家带来对象的构造及初始化的小文,希望能够帮助大家!