4.this引用
4.1 为什么要this引用
我们先看一段正确的代码
public class Date {//建一个日期类
public int year;//年
public int month;//月
public int day;。。日
//输出年,月,日的方法
public void setDate(int y,int m,int d) {
year = y;
month = m;
day = d;
}
//输出
public void printDate(){
System.out.println("今天是"+year+"年"+month+"月"+day+"日");
}
public static void main(String[] args) {
Date date = new Date();//实例化一个对象
date.setDate(2024,5,15);//给方法传参,输入日期
date.printDate();//输出
}
}
// 输出结果:
// 今天是2024年5月15日
如上段代码,其当输入日期的方法setDate中的形参与变量名字相同时,即:
public void setDate(int year, int month, int day){
year = year;
month = month;
day = day;
}
这样的代码在运行不会出错,但结果就会变成类型对应的零值
因为在这个方法中,参数与变量名相同,到底是谁给谁赋值?成员变量给成员变量?参数给参数?参数给成员变量?成员变量参数?估计我们自己都搞不清楚了。
这个时候就要用到关键字thisl了,用上this关键字就输出正常了,如:
public void setDate(int year, int month, int day){
this.year = year;
this.month = month;
this.day = day;
}
4.2什么是this引用
我们先来看看官方的说法:
this引用指向当前对象(成员方法运行时调用该成员方法的对象),在成员方法中所有成员变量的操作,都是通过该引用去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。
这个什么意思呢?我来给大家解释一下,我们在调用方法时,如:
Date date = new Date();
date.setDate(2024,5,15);
Date date1 = new Date();
date1.setDate(2023,3,25);
我们实例化了两个对象,用“.”的方式完成了调用方法,即:
date.setDate(2024,5,15);
public void setDate(int year, int month, int day){
this.year = year;
this.month = month;
this.day = day;
}
方法内部的this就代表调用这个方法的对象的名字。
4.3this 引用的特性
1.this的类型:对应类类型引用,即哪个对象调用就是哪个对象的引用类型
2.this只能在"成员方法“中使用。
3.在"成员方法”中。this只能引用当前对象,不能再引用其他对象。
4.this"成员方法“第一个隐藏的参数,编译器会自动传递,在成员方法执行时,编译器会负责将调用成员方法对象的引用传递给该成员,this负责来接收。
5.对象的构造及初始化
5.1.如何初始化对象
前面我们学过,如果我们定义了一个局部变量,没有初始化的话,程序会报错。
public static void main(String[] args) {
int a;
System.out.println(a);
}
// Error:(26, 28) java: 可能尚未初始化变量a
要想通过上述代码。只需要我们给a一个初始化的值即可。
而对象的话,我们每次输出值时,都运用了setDate方法,给了他一个值。
public static void main(String[] args) {
Date date = new Date();//实例化一个对象
date.setDate(2024,5,15);//给方法传参,输入日期
date.printDate();//输出
}
根据这个我们就有两个问题:
1.每次对象创建好后调用SetDate方法设置具体日期,比较麻烦,那对象该如何初始化?
2. 局部变量必须要初始化才能使用,为什么字段声明之后没有给值依然可以使用?
5.2构造方法
5.2.1 概念
构造方法(也称为构造器)是一个特殊的成员方法,名字必须与类名相同,在创建对象时,由编译器自动调用,并且在整个对象的生命周期内只调用一次。
看代码:
public Date(int year,int maonth,int day){
this.year = year;
this.month = month;
this.day = day;
}
这个时候可能就有人要问了,这么写是要怎么调用呢?什么时候用呢?
其实在你实例化对象的时候,系统就会自动调用构造函数,
问:我们之前没有写这个构造函数,但是整个程序还是可以正常运行的,为什么?
答:因为在我们没有写构造函数的时候,系统就会调用系统自带的构造函数,所以不会报错
5.2.2特性
1.名字必须与类名相同
2.没有返回值类型,设置为void也不行
3.创建对象时有编译器自动调用,并且在对象的生命周期内只调用一次(相当于人的出生,每个人只能出生一次)
4,构造方法可以重载(用户根据中自己的需求踢狗不同参数的构造方法)
5.如果用户没有显示定义,编译器会生成一份默认的构造方法,生成的默认构造方法一定是无参的。
6.构造方法中,可以通过this调用其他构造方法来简化代码
7.this必须在构造方法中第一条语句,并且不能成环
8.绝大多数情况下使用public来修饰,特殊场景下会被private修饰
注:一旦用户定义,编译器就无法生成
5.3默认构造方法
在成员变量定义时,可以不用进行初始化,因为他们在对象空间被申请好之后,对象中包含的成员已经设置好了初始值,比如:
数据类型 | 默认值 |
---|---|
byte | 0 |
char | ‘\u0000’ |
short | 0 |
int | 0 |
long | 0L |
boolean | false |
float | 0.0f |
double | 0.0 |
reteebce | null |
5.4.就地初始化
在声明成员变量时,就直接给出了初始值。
public int year=2024;
public int month=5;
public int day=15;
但是整个需要注意的是,这个是在代码编译完成后,编译器会将所有给成员初始化的这些语句添加到各个构造函数中。