- 博主简介:努力学习的预备程序媛一枚~
- 博主主页: @是瑶瑶子啦
- 所属专栏: Java岛冒险记【从小白到大佬之路】
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");
}
🎨对象创建流程:
-
【类的加载阶段】首先,当读到
Account account01 = new Account("Yaoayo",20,"123456")
的时候,Account 类被加载进JVM内存方法区(只加载一次) -
【类的初始化阶段】遇到
new
时,对类进行初始化:(只有类/接口首次被Java程序使用时才进行类的初始化–即仅初始化一次)- 为类在方法区静态变量赋予默认初始值
- 执行类的静态代码块
-
【对象的内存分配】为新的实例对象在堆内存中分配内存空间
-
【对象的初始化阶段】
a.【默认初始化】:将成员变量赋予默认初始化值:name=null;balance=0.0;pwd=null;
b.【显示初始化】:即执行在类声明中的手动赋值语句:balance=50;
(显示初始化的本质是代码块的执行)
c.【构造器初始化】:JVM自动调用构造器/构造方法:name=“Yaoyao”;balance=20;pwd=“123456”; -
【引用变量赋值】:将本次新对象在堆内存中地址以数字形式赋值给在栈种的引用变量/类类型变量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