1.构造方法
1.1 构造方法的概念
构造方法是一种特殊的成员方法,它可以使得创建对象和为对象的成员变量赋值同时实现
我们new一个对象的时候,都是new + 类名 +(),这个()可不是摆设,它代表了不带参数的构造方法,那带参数的构造方法怎么写呢
来看看如下代码
class Student {
int age;
String name;
Student(String n, int a) {
name = n;
age = a;
}
}
public class Main {
public static void main(String[] args) {
Student a = new Student("张三",18);
}
}
这个便是构造方法,我们在主函数传过去的实参要与构造方法中设置的形参相对应,实参由构造方法中的形参接收,并且在方法体中进行相应操作
1.2 构造方法的特性
1.构造方法的方法名必须与类名相同
2.构造方法没有类型,即什么类型都不要加
3.构造方法由编译器自动调用,生命周期只有一次
4.如果我们没有显示定义一个构造方法,编译器会自动为我们提供一个不带参数的构造方法,如果显示定义了一个构造方法,那么编译器就不会为我们提供一个不带参数的构造方法
为什么要强调这个特性呢,让我们来看下图
我有一个学生b,我还不知道他的年龄和姓名,于是我想之后再给他赋值,但是此时编译器报错了,这就是因为我们已经显式定义了一个带参数的构造方法,编译器就不提供不带参数的构造方法了,所以编译器就报错
5.构造方法可以重载,一个类中可以有多个构造方法,而且构造方法中可以用this调用其他构造方法,下面展示这种特性解决4中的问题
class Student {
int age;
String name;
Student(String n, int a) {
name = n;
age = a;
}
Student() {
this("未知",-1);
}
}
public class Main {
public static void main(String[] args) {
Student a = new Student("张三",18);
Student b = new Student();
}
}
学生b不是不知道姓名年龄嘛,我就显式定义一个不带参数的构造方法,在这个构造方法中我用this调用带参数的构造方法,并且传入,未知和-1,以此代表该学生的姓名年龄未知,这样就解决了不知道姓名年龄的问题,不过要注意在构造方法中用this调用另一种构造方法一定要将this放在第一位,还有有多种构造方法的话,就根据你想调用的构造方法传入对应的实参就好
还有一点要注意,两个构造方法不能互相调用对方,这样会陷入死循环
2.this引用
我们先来看一个场景
class Student {
int age;
String name;
Student(String name, int age) {
name = name;
age = age;
}
}
public class Main {
public static void main(String[] args) {
Student a = new Student("张三",18);
System.out.println(a.name);
System.out.println(a.age);
}
}
我想创建一个学生a,名叫张三,18岁,并且我想输出学生a的姓名和年龄,让我们看下运行结果
纳尼,怎么会这样,我不是在构造器中,为我的学生a的姓名和年龄都赋值了吗,怎么会输出null和0呢
我们知道null和0是String和int型的成员变量未被赋初值的时候编译器给予它们的默认值,这意味着我的赋值操作失败了
为什么会这样呢,让我们分析下我们的代码
诶,我们发现成员变量和形参的名字重复了,这是问题的所在吗
我可以明确的告诉你是的
java编译器遵循就近原则,这意味着当名字相同时,它会调用最近的那个变量,这意味着我们的写法是形参给形参赋值,跟我们的成员变量没有半毛钱关系
而this引用就是为了解决这个问题而来的
它的作用是在当前对象的成员方法中调用对象的成员变量
让我们来修改上文的代码
再次输出姓名和年龄
perfect,我们成功的输出了a的姓名和年龄,更重要的是我们了解this的作用,它可以在对象的成员方法中调用成员方法
接下来有几点关于this的tips
1.this的类型:哪个对象调用的就是哪个对象的引用类型,如上文对象a调用的this就是对象a的引用类型
2.this只能在成员方法中使用
3.在成员方法中,this只能引用当前对象
如果觉得这篇文章对你有用的话,就请点个赞吧=-=