一、引入构造器
一个需求:在创建人类的对象时,是先把一个对象创建好后,再给他的年龄和姓名属性赋值,如果现在要求,在创建人类的对象时,就直接指定这个对象的年龄和姓名,该怎么做?
这时就可以使用构造器。
二、构造器
1、介绍
构造方法又叫构造器(constructor),是类的一种特殊的方法,它的主要作用是完成对新对象的初始化。
说明“初始化”:走到构造器这个层面的时候,对象已经存在了。只是对对象属性的值进行初始化。构造器是初始化对象,不是创建对象。
2、特点
- 方法名和类名相同
- 没有返回值
- 在创建对象时,系统会自动调用该类的构造器完成对象的初始化。
3、基本语法
[修饰符] 方法名(形参列表) {
方法体;
}
说明
- 构造器的修饰符可以默认, 也可以是 public protected private
- 构造器没有返回值
- 方法名 和类名字必须一样
- 参数列表 和 成员方法一样的规则
- 构造器的调用, 由系统完成
- 属性有默认值。构造器对进行属性初始化操作,如果有的属性没有初始化到,会有默认值。
4、案例
public class Constructor01 {
//编写一个 main 方法
public static void main(String[] args) {
Person p = new Person("smith", 80);
System.out.println("name = " + p.name +" age = "+p.age);
}
}
class Person {
String name;
int age;
public Person(String pName, int pAge) {
System.out.println("构造器被调用 完成对象属性的初始化");
name = pName;
age = pAge;
}
}

5、注意事项和使用细节
(1)一个类可以定义多个不同的构造器,即构造器重载
(2)构造器名和类名要相同
(3)构造器没有返回值
(4)构造器是完成对象的初始化,并不是创建对象
(5)在创建对象时,系统自动的调用该类的构造方法
(6)如果程序员没有定义构造器,系统会自动给类生成一个默认无参构造器(也叫默认构造器),比如 Dog (){ },使用 javap 指令反编译看看
(7)一旦定义了自己的构造器,默认的构造器就覆盖了,就不能再使用默认的无参构造器,除非显式的定义一下,即:Dog (){ } 写(这点很重要)
补充说明(6)
编译之后 目录下会出现一个Dog.class。程序员使用反编译指令 javap 就可以把 Dog.class 变成 Dog类。
源代码为:
class Dog {
}

在JDK的bin安装目录下


javap使用资料请见韩顺平老师分享的资料。
补充说明(7)
源代码:
class Dog {
Dog(String pName) {
//
}
}
由反编译指令可以看出,现在只有参数为String的构造器。

说明默认的构造器就覆盖了,就不能再使用默认的无参构造器,除非显式的定义一下。
修改源代码为:
class Dog {
public Dog(String pName) {
//
}
Dog() {
}
}

三、对象创建流程
流程分析
class Person {
String name;
int age = 90;
Person(String n, int a) {
name = n;
age = a;
}
}
Person p = new Person("小倩", 20);
分析Person p = new Person(“xxx”, 20);到底发生了什么事情。
①方法区加载 Person 类信息。
②new 在堆开辟空间,先进行默认初始化,age第一次填写进去的是0,name第一次填写的是null。
③然后进行显式初始化,age变成90,此时name还是空
④处理构造器。
“小倩”存放在方法区的常量池,name从null改为指向常量区地址
20赋给age
此时,上述流程结束后,new才算做完。
返回地址给p

请注意,真正的对象指的是堆里面的。P本质是对象的引用/名字。
流程分析(面试题)
- 加载Person类信息(Person.class),只会加载一次
- 在堆中分配空间(地址) 。分配空间就会自动分配地址
- 完成对象初始化
[3.1默认初始化 age=0 name=null
3.2显式初始化age=90,name=null,
3.3构造器的初始化 age =20,name=小倩] - 在对象在堆中的地址,返回给p(p是对象名,也可以理解成是对象的引用)
本笔记是对韩顺平老师的Java课程做出的梳理。方便本人和观看者进行复习。
课程请见: https://www.bilibili.com/video/BV1fh411y7R8/?spm_id_from=333.999.0.0&vd_source=ceab44fb5c1365a19cb488ab650bab03
Java构造器详解:创建、语法与使用细节
828

被折叠的 条评论
为什么被折叠?



