一、构造方法的介绍
开发过程中经常需要在创建对象的同时明确对象的属性,比如员工刚入职公司就要明确他的姓名、年龄等属性信息。
那么在创建对象就要明确属性值,如何实现呢?也就是在创建对象的时候就要做的事情,当使用new关键字创建对象时,怎么给对象属性初始化值呢?这里就要用到Java的构造方法。
那么什么是构造方法?从字面理解即为构建创造时用的方法,既对象创建时要执行的方法。既然是对象创建时候要执行的方法,那么只要在new对象时,知道其执行的构造方法是什么,就可以在执行这个方法的时候给对象进行属性赋值。
构造方法定义语法的格式:
修饰符 构造方法名(参数列表){}
构造方法的特点:
1、构造方法无返回值类型,如:void等。也不需要写返回值,因为它是为构建对象的,对象创建完,方法就执行结束。
2、构造方法名称必须和本类的名称保持一致。
构造方法的代码体现:
1 public class Person { 2 private String name; 3 private int age; 4 5 /* 6 * 定义出Person类无参的构造方法 7 */ 8 public Person() { 9 10 } 11 12 /* 13 * 定义出Person类含有参数的构造方法 14 */ 15 public Person(String name,int age) { 16 //System.out.println("我是一个空参数的构造方法"); 17 this.name = name; 18 this.age = age; 19 }
二、构造方法的调用和图解说明
首先看构造方法是如何执行的呢?在创建对象的时候是如何初始化的呢?
构造方法是专门用来创建对象,也就是在new对象的时要调用构造方法,如下面的代码体现:
1 public class Person { 2 // Person的成员属性age和name 3 private int age; 4 private String name; 5 6 // Person的构造方法,拥有参数列表 7 Person(int a, String nm) { 8 // 接受到创建对象时传递进来的值,将值赋给成员属性 9 this.age = a; 10 this.name = nm; 11 } 12 13 public void speak() { 14 System.out.println("name=" + name + ",age=" + age); 15 } 16 } 17 /* 18 * 测试类PersonDemo 19 * */ 20 class PersonDemo { 21 public static void main(String[] args) { 22 // 创建Person对象,并明确对象的年龄和姓名 23 Person p = new Person(23, "张三"); 24 p.speak(); 25 }
上述代码对创建对象时,对构造方法的调用。既在创建对象时,会调用与参数列表对应的构造方法。
上述代码的构造方法原理图:
上述原理图说明:
1、首先会将mian主程序入口方法压栈,执行mian方法中的new(23,"张三");
2、在堆内存中划分一块区域,用来存放创建Person对象,这片区域内会有属于自己的内存地址0x001,然后给成员变量默认初始值(name=null,age=0)
3、此时,拥有两个参数的构造方法(Person(String nm , int a))压栈,在这个构造方法中第一行有个隐式的this(),因为构造方法是给对象初始化的,那个对象调用到这个构造方法,this就指向堆中的那个对象。
4、由于Person(String nm , int a)构造方法中使用了this(nm);构造方法Person(String nm)就会压栈,并将“张三”传递给nm。在Person(String nm , int a)构造方法中同样也有隐式的this,this的值同样也为0x001,这时会执行其中name = nm,即把“张三”赋值给成员的name。当赋值结束后Person(String nm , int a)构造方法弹栈。
5、程序继续执行构造方法(Person(String nm , int a)中的age = a;这时会将23赋值给成员属性age。赋值结束构造方法(Person(String nm , int a)弹栈。
6、当构造方法(Person(String nm , int a)弹栈结束后,Person对象在内存中创建才算真正完成,并将0x001赋值给main方法中的引用类型p引用变量。