在上篇博客中为大家讲解了什么是类、什么是对象以及如何实例化一个类。那么从这篇博客开始就要深入类与对象啦。这篇博客主要会讲解一下this这个关键字以及它的用法,文章不长,依旧还是写的很详细哦,快来看看吧~
目录
1、this引用
1.1为什么要有this引用
1.2什么是this引用
1.3this引用的特性
2、this引用的三种方法
2.1 使用this引用来访问成员变量
2.2 使用this引用调用构造方法
2.3使用this引用调用成员方法
先来看一个日期类例子:
class Data{
//属性
public int year;
public int month;
public int day;
//方法
public void setData(int y,int m,int d){
year=y;
month=m;
day=d;
}
public void printData(){
System.out.println(year+","+month+","+day);
}
}
public class Test {
public static void main(String[] args) {
Data data1=new Data();
Data data2=new Data();
Data data3=new Data();
data1.setData(2000,12,15);
data2.setData(2001,11,05);
data3.setData(2020,22,35);
data1.printData();
data2.printData();
data3.printData();
}
}
运行结果:
以上代码定义了一个日期类,然后main方法中创建了三个对象,并通过Date类中的成员方法对对象进行设置和打印,代码整体逻辑非常简单,输出也是我们需要的结果。
但是仔细一想,如果我们将形参的变量名改的和成员变量名一样了呢?
比如我们将Date类中的setDate()方法不小心写成了这个样子呢:
public void setData(int year,int month,int day){ year=year; month=month; day=day; }
再来看一下输出结果:
这个输出结果就不是我们所需要的了。 可是为什么会这样呢?
我们可以发现,就拿year这个变量来说,存在成员变量year和方法setDate()中的参数year,成员变量中变量year的作用域是整个类,而方法setDate()中的参数year的作用域就只是在方法setDate()内部,因此可以发现两个year的作用范围有了冲突。
Java语言规定当作用范围小的变量与作用范围大的变量有重叠部分时,作用域小的变量会覆盖作用域大的变量。但是这种情况往往是我们不想要的,我们不希望谁去覆盖谁,为了解决这种问题,就要用到this这个关键字。这种情况下需要访问成员变量a则必须使用this进行引用.当然,如果变量名不发生重叠,则this可以省略。但是为了增强代码的可读性,一般将参数的名称和成员变量的名称保持一致,所以this的使用频率在规范的代码内部应该很多。
java编译器给每一个成员方法都增加了一个隐藏的引用类型参数,该引用参数指向了当前对象(成员方法运行时调用该成员方法的对象),在成员方法中所有对成员变量的操作,都是通过该引用去访问。只不过该引用对用户来说是透明的,用户不需要进行传递,编译器会自己加上。
(1) this的类型:对应类类型引用,即哪个对象调用就是哪个对象的引用类型。
(2)this只能在"成员方法"中使用。
(3)在"成员方法"中,this只能引用当前对象,不能再引用其他对象,具有final属性。
(4) this是“成员方法”第一个隐藏的参数,编译器会自动传递,在成员方法执行时,编译器会负责将调用成员方法对象的引用传递给该成员方法,this负责来接收。
下图中的Date类也是可以通过编译的
class Data{ public int year; public int month; public int day; public void setData(int year,int month,int day){ this.year=year; this.month=month; this.day=day; }}
class Ts{
public Ts(){//调用含两个参数的构造方法
this(10,20);
}
public Ts(int a,int b){
System.out.println("a+b="+(a+b));
}}
public class Test {
public static void main(String[] args) {
Ts ts=new Ts();}
}
运行结果:
注意:
(1)只能在构造方法中用this()调用其他构造方法,不能在成员方法中使用this()。
(2)this只能出现在构造方法的第一行,且只能出现一次。
(3)不能形成环,也就是不能在一个类中的两个构造方法中使用this()互相调用。
class Data{ public int year; public void setData(int year,int month,int day){ this.year=year; } public void printData(){ System.out.println(this.year); } public void printData1(){ this.printData(); } }
注意:在printData1()方法中通过this.printData1()访问printData()方法,注意此处的this关键字可以不写,效果是一样的。
以上就是我要今天分享的内容啦,后续我还会继续更新的哒,常看我的博客会学到很多知识哦