一、构造方法
1. 知识点概括
构造方法:又称构造函数、构造器、构建器
与类同名,没有返回值类型的方法叫构造方法
作用:帮助完成对象的创建并对属性(成员变量)进行初始化
使用:当(new)创建对象(实例化)时,会自动调用对应的构造方法
构造方法也是方法的一种,有些特殊,但是一样可以重载
构造方法的定义特殊
构造方法的调用特殊
Java编译器默认会提供一个无参构造,但是如果自定义了构造方法,默认的无参构造会被覆盖,如果需要用到无参构造需要手动添加
2. 构造方法的结构(如何定义构造方法)
与类同名,没有返回值类型的方法,可以含参可以不含参
public class Student {
// 构造方法
Student() {}
}
3. 调用构造方法
public class Student {
// 构造方法
Student() {
System.out.println("Student的无参构造");
}
}
public class ConstructTest {
public static void main(String[] args) {
Student s1 = new Student();
}
}
4. 默认提供一个无参构造
Java编译器默认会提供一个无参构造,但是如果自定义了构造方法,默认的无参构造会被覆盖,如果需要用到无参构造需要手动添加
Java编译器默认会提供一个无参构造
public class Student {
}
public class ConstructTest {
public static void main(String[] args) {
Student s1 = new Student();
}
}
如果自定义了构造方法,默认的无参构造会被覆盖
有此可见,本来存在的无参构造,经过我们添加了一个有参构造后,消失了,导致我们new对象的时候,调用不到了,这样就能间接的证明我们的观点: 如果自定义了构造方法,默认的无参构造会被覆盖
错误代码:
public class Student {
Student(String stuId) {
System.out.println("有参构造方法");
}
}
public class ConstructTest {
public static void main(String[] args) {
Student s1 = new Student(); // 报错 - 编译错误
}
}
5. 构造方法的主要作用
构造方法的主要作用就是为了给成员变量赋初始值
public class Student {
// 成员变量 - 属性/特征
String stuId; // 学号
String name; // 名字
int age; // 年龄
String address; // 地址
// 构造方法(有参构造)
Student(String stuId,String name,int age,String address) {
this.stuId = stuId;
this.name = name;
this.age = age;
this.address = address;
}
void sayHi(){
System.out.println("大家好,我的学号是" + stuId + ",我叫"+name+",今年"+age+"岁了,家住"+address);
}
}
public class ConstructTest {
public static void main(String[] args) {
Student s1 = new Student("JSD2207080101","zs",18,"沈阳");
s1.sayHi();
}
}
二、this 关键字
思考:上面的代码中我们使用了 this 这样一个关键字 ,那这个关键字起到了什么作用呢?
这里首先涉及到了Java中变量的使用:
成员变量和局部变量相同名称时,默认采用就近原则(谁离得近使用的就是谁)
但是由于我们构造方法是想给成员变量赋初始值,为了区分,我们可以使用 this 关键字
this 指代的是当前对象,哪个对象调用方法指的就是哪个对象
this.成员变量
访问成员变量
当成员变量和局部变量同名时,如果想访问成员变量,不能省略this
this.方法名()
调用方法(一般不用)
this()
调用构造方法(一般不用)
在构造方法里,必须放置在构造方法的第一行
三、内存结构初识
内存结构:JVM
堆
new出来的对象(成员变量,数组的元素)
栈
局部变量(方法的参数)
基本类型存储的是值
引用类型存储的是内存中的地址(指的是对应对象的内存地址)
内存图
四、null 和 NullPointerException
1. null
null 表示空,没有指向任何对象
2. NullPointerException
当引用的值为 null 时,该引用不能进行任何 点 操作,若操作会发生NullPointerException
五、引用类型数组(上)
基本类型数组
给元素赋值时,直接赋值即可
元素存储的是基本类型对应的值
引用类型数组
给元素赋值时,需要 new 对象
元素存储的是引用类型的内存地址
public class Student {
// 成员变量 - 属性/特征
String stuId; // 学号
String name; // 名字
int age; // 年龄
String address; // 地址
// 构造方法(有参构造)
Student(String stuId,String name,int age,String address) {
this.stuId = stuId;
this.name = name;
this.age = age;
this.address = address;
}
}
public class StudentTest {
public static void main(String[] args) {
int a = 5;
Student s = new Student("JSD2207080101","zs",18,"沈阳");
int[] arr = {1,3,5};
Student[] students = new Student[3];
students[0] = new Student("JSD2207080102","ls",20,"大连");
students[1] = new Student("JSD2207080103","ww",18,"铁岭");
students[2] = new Student("JSD2207080104","zl",27,"抚顺");
}
}
六、拓展
1. 成员变量与局部变量的区别
2. 创建对象的流程
Student s = new Student(); // 短短这行代码发生了很多事情
把 Student .class 文件加载进内存
在栈内存中,开辟空间,存放引用变量 s
在堆内存中,开辟空间,存放 Student 对象
对成员变量进行默认的初始化
对成员变量进行显示初始化
执行构造方法(如果有构造代码块,就先执行构造代码块再执行构造方法)
堆内存完成
把堆内存的地址值赋值给变量 s ,s 就是一个引用变量,引用了 Student 对象的地址值
七、练习题
1. 习题
1.1 NullPointerException 练习
编写一段代码,运行后可以出现 NullPointerException 这样一个异常
1.2 构造方法 练习
编写一段代码,证明构造方法可以重载
编写一段代码,证明 new对象 时自动调用构造方法
编写一段代码,证明创建一个有参的构造函数,默认的无参的构造函数就被替代掉了