JAVA-构造方法Constructor(构造器)详解及代码解读

构造方法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;
	}
	
}
  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值