【JavaSE】一文看懂构造器/构造方法(Cunstructor)

勤奋不是嘴上说说而已,而是实际的行动,在勤奋的苦度中持之以恒,永不退却。业精于勤,荒于嬉;行成于思,毁于随。在人生的仕途上,我们毫不迟疑地选择勤奋,她是几乎于世界上一切成就的催产婆。只要我们拥着勤奋去思考,拥着勤奋的手去耕耘,用抱勤奋的心去对待工作,浪迹红尘而坚韧不拔,那么,我们的生命就会绽放火花,让人生的时光更加的闪亮而精彩。

导读:本篇文章讲解 【JavaSE】一文看懂构造器/构造方法(Cunstructor),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

在这里插入图片描述

在这里插入图片描述

Part1:引入

👩‍🎨write in the front:

  • 🙇‍♀️在上一篇我们讲类&对象的时候,对于属性,我们采用的是手动赋值(初始化)。我们会想,能不能创建对象的时候就给各个属性初始化/赋值呢?Java中提供了一种方法,可以更简洁地为实例变量进行初始化赋值———–构造器✅

  • 【介绍】:构造器(又称:构造方法/Constructor)是类的一个特殊方法,在创建对象时会被系统自动调用,来完成对象属性初始化

Part2:构造器介绍

2.1:构造器语法格式:

[访问修饰符] 构造器名 (形参列表){
	方法实现;
}
//修饰符可以为默认
  • 举例:
public class Account {
    private String name;
    private double balance;
    private String pwd;
	
	//Account类的一个构造器
	public Account (String name,double balance,string pwd){
		//构造器的实现---初始化对象
		this.name = name;
		this.balance = balance;	
		this.pwd = pwd;
}

2.2:注意事项&使用细节🌟:

🙆‍♀️注意事项&使用细节:

  • 构造器没有返回值
  • 构造器名/构造方法名必须和类名相同
  • 没有在类中显示声明一个构造器时,系统默认存在并调用默认构造器—>类名(){ }
public class Account {
    private String name;
    private double balance;
    private String pwd;
	
	//当没有显示声明任何一个构造器时,下面这个构造器会在编译时候自动加上去,是一个默认构造器:
	public Account(){
	}
}
  • 一个类中可以定义多个不同的构造器(不同主要体现在参数列表上),即构造器的重载
  • 每个类至少需要一个构造器,以便new对象的过程中被调用
  • 构造器的作用:在创建新对象时,完成对象初始化
  • 一旦在类中声明定义了一个构造器,默认构造器将被覆盖,除非将默认构造器显示定义一下。
    • 为什么我们自己定义了构造器,JVM就不帮我生成默认构造器了呢?因为当我们没有定义任何构造方法时,JVM认为用户不需要,但是又必须有一个构造器存在,以被new对象的过程调用,所以自动生成了一个默认的空构造器。
    • 当我们自己定义了构造方法时,JVM认为我们知道自己需要什么初始化方式的构造器,所以就不帮我们自动生成那个默认的空构造器了,除非我们显示定义一下(告诉JVM,空构造器我们也是需要的)

Part3:分析–构造器被调用过程

👩‍🎨write in the front:

  • 🙇‍♀️构造器是完成新对象初始化的,不是用来创造对象的。即,对象先被创建,系统再去自动调用构造器/构造方法,来初始化对象。既然要搞清楚这个过程,我们必须了解–对象创建流程.

  • 栗子
public class Account {
    private String name;
    private double balance=50;
    private String pwd;
	
	//Account类的一个构造器
	public Account (String name,double balance,string pwd){
		//构造器的实现---初始化对象
		this.name = name;
		this.balance = balance;	
		this.pwd = pwd;
}
class Test{
	public static void main(String[] args) {
		//创建对象(构造器完成该对象初始化)
        Account account01 = new Account("Yaoayo",20,"123456");
    }

🎨对象创建流程:

  1. 【类的加载阶段】首先,当读到Account account01 = new Account("Yaoayo",20,"123456")的时候,Account 类被加载进JVM内存方法区(只加载一次)

  2. 【类的初始化阶段】遇到new时,对类进行初始化:(只有类/接口首次被Java程序使用时才进行类的初始化–即仅初始化一次)

    • 为类在方法区静态变量赋予默认初始值
    • 执行类的静态代码块
  3. 【对象的内存分配】为新的实例对象在堆内存分配内存空间

  4. 【对象的初始化阶段】
    a.【默认初始化】:将成员变量赋予默认初始化值:name=null;balance=0.0;pwd=null;
    b.【显示初始化】:即执行在类声明中的手动赋值语句:balance=50;
    (显示初始化的本质是代码块的执行)
    c.【构造器初始化】:JVM自动调用构造器/构造方法:name=“Yaoyao”;balance=20;pwd=“123456”;

  5. 【引用变量赋值】:将本次新对象在堆内存中地址以数字形式赋值给在栈种的引用变量/类类型变量Account account01 = 0x423;

在这里插入图片描述

Part4:构造器再深入

通过上面的讲解,恭喜你,对构造器已经有一个非常扎实的了解和基础。但是构造器还隐藏了哪些”不为人知的秘密”?(如果是小白,看不太懂的话,可以先跳过这一Part,等学完专栏的this关键字,和代码块,两篇文章,再来看也完全OK!)

在一个构造器中,如果没有显示使用this()和super(),只是单纯地对本类属性进行初始化。那么这个构造器还包括以下两部分:

  • super()(调用父类默认无参构造器)
  • non-static代码块(调用本类普通代码块)

eg:

class AAA{
	public AAA(){
		//super()
		//non-static代码块
	}

super()是调用父类构造器,也可显示调用(但默认的就会被覆盖),也可this()调用父类构造器。但是:在本类构造器中调用父类构造器/本类其他构造器,调用一次且必须位于行首!

为什么this调用super调用必须位于行首呢?目的是防止误操作,构造器的本质就是根据需求初始化本对象,如果先根据本身需求初始化本对象,再调用其他构造器,本身需求很有可能被后来者覆盖。而先调用其他构造器初始化,再视情况作符合自身的初始化,这样才能让修改不被覆盖,符合我们的需求


🏄‍♀️下期预告–详细讲解JavaSE–this详解
🙆‍♀️专栏系列文章:

🙈原创不易,如果对你有所帮助,还请三连+关注!我是瑶瑶子,持续输出优质文章!

在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/142457.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!