构造方法Constructor (构造器)
一、构造方法的作用
简单来说就是完成对象的创建和对象的初始化 (给对象的所有属性赋值)
- 构造方法的执行分为两个阶段:对象的创建和对象的初始化。顺序不能颠倒也不能分割。
- 在Java中,当我们使用关键字
new
时,就会在内存中创建一个新的对象,虽然对象已经被创建出来了,但还没有被初始化。而初始化则是在执行构造方法体时进行的。
二、定义构造方法
[修饰符列表] 构造方法名(形参列表){
构造方法体;
}
注意:① 构造方法名必须和类名一致
② 构造方法不需要提供返回值类型,默认返回该创建的对象的地址
三、构造方法的调用
使用new
运算符来调用
语法:new
构造方法名(实参)
注意:① 构造方法最终执行结束之后,会自动将创建的对象的内存地址返回。但构造方法体中不需要提供return 值
这样的语句
② 如果一个类中没有显式定义构造方法,系统默认提供一个无参数的构造方法(这样被称为缺省构造器)
③ 如果一个类中定义了带参数的构造方法,无参数的构造方法不会默认创建,因此建议定义多个构造方法(方法重载),手动加上无参的构造方法
四、构造方法执行原理
- 构造方法执行包括两个重要的阶段
- 第一阶段:对象的创建
- 第二阶段:对象的初始化
- 对象在什么时候创建的
- 在
new
的时候,会直接在堆内存中开辟空间。然后给所有属性赋默认值,完成对象的创建。(这个过程是在构造方法体执行之前就完成了) - 构造方法体开始执行,标志着开始进行对象初始化。构造方法体执行完毕,表示对象初始化完毕。(构造方法体通常是对对象的属性进行赋指定值或默认值)
- 在
六、构造方法代码解读
public class Constructor{
public static void main(String[] args){
// 默认调用无参构造方法完成学生对象的创建和初始化
Student s1 = new Student(); //此时s1.name=null ; s1,age=0 (因为调用的无参构造方法没有赋值)
Student s2 = new Student("lisi", 21); //此时s2.name='lisi'; s2.age=21 (因为调用的带参构造方法给属性赋值了)
Student s3 = new Student("lisi"); //此时s3.name='lisi' ; s3.age=0; (因为只初始化了name的值,而没有给age赋值)
}
}
public class Student{
// 学生姓名
private String name;
// 学生年龄
private int age;
// 定义一个无参构造器
public Student(){
System.out.println("Student类的无参构造方法执行了")
}
//定义一个带完整参数的构造方法
public Student(String name, int age){
this.name = name;
this.age = age;
System.out.println("Student类的带全部参数的构造方法执行了")
}
// 定义一个带部分参数的构造方法
public Student(String name){
this.name = name;
System.out.println("Student类带部分参数的构造方法执行了")
}
}
*六、构造代码块
- 每
new
一次对象就会先自动执行构造代码块内容,无论是无参构造还是有参构造 - 构造代码块是在构造方法执行之前执行的
- 构造代码块中可以使用this. ,说明构造代码块执行之前对象已经创建好了,并且系统已完成默认赋值
- 用处:
- 如果所有的构造方法在最开始的时候有相同的一部分代码,不妨将这个公共的代码提取到构造代码块当中。
注意下面代码中各Student对象的属性值区别
- 如果所有的构造方法在最开始的时候有相同的一部分代码,不妨将这个公共的代码提取到构造代码块当中。
public class Constructor{
public static void main(String[] args){
// 默认调用无参构造方法完成学生对象的创建和初始化
Student s1 = new Student(); // 输出:构造代码块执行! s1.name = 'tom' ; s1.age = 0
Student s2 = new Student("lisi", 21); // 输出:构造代码块执行! s2.name = 'lisi' ; s1.age = 21
Student s3 = new Student("lisi"); // 输出:构造代码块执行! s3.name = 'lisi' ; s3.age = 0;
}
}
public class Student {
// 学生姓名
private String name;
// 学生年龄
private int age;
// 构造代码块
{
System.out.println("构造代码块执行!");
this.name = 'tom'
}
// 定义一个无参构造器
public Student(){
}
//定义一个带完整参数的构造方法
public Student(String name, int age){
this.name = name;
this.age = age;
}
// 定义一个带部分参数的构造方法
public Student(String name){
this.name = name;
}
}