this 关键字
特点:this代表其所在函数所属对象的引用
换言之:this 代表本类对象的引用。
什么时候使用this关键字呢?
当在函数内需要用到调用函数的对象时,就用this。
使用场景
当成员变量和局部变量重名,可以用关键字this来区分
this:代表对象,代表哪个对象呢?当前对象
this就是所在函数所属对象的引用。
简单说:哪个对象调用了this所在的函数,this就代表哪个对象。
class Person{
private String name;
private int age;
Person(String name){ //为了增加代码的阅读性,我们取变量名的时候,要有实质意义,
//name=name;//这样的赋值时赋值给栈中的name,而不是给堆中的,要明确给堆中的使用this关键字
this.name=name;
/**当Person的构造函数为name=name的时候。
speak函数打印的结果是null:0;
当Person的构造函数为this.name=name的时候。
speak函数打印的结果为旺财:0。*/
}
void speak(){
System.out.prinln(name+":"+age);
}
public static void main(String[] args){
Person O=new Person("旺财");
O.speak();
/**
在内存中的运行原理:
1:main函数进栈,产生o,然后在堆中产生地址(假设地址:0X0045),在堆中有name,age,进来分别赋值为null,0;
2:Servle1(name)进栈,把"旺财"给传进去,然后在构造函数中,有this关键字通过地址来
区分到底是给那个一个对象进行赋值,赋值完之后,就执行return弹栈,
3.然后在产生的o对象,就会指向开始产生的地址(假设地址:0X0045)
4.然后speak就会进栈,其实name,age前面都是省略了this关键字,this.name,的意思就是当前对象的姓名(其实就是地址里面的姓名)*/
}
}
this关键字也可以使用在构造函数中调用其他构造函数。
class Person{
private String name;
private int age;
Eight1(){
name="baby";
age=1;
System.out.println("Person run");
}
Eight1(String name){
this.name=name;
}
Eight1(String name,int a){
this(name); //为了提高代码的复用性,我们不写this.name=name;因为上面有这句代码的初始化动作
this.age=a;
}
public void speak(){
System.out.println(name+":"+age);
}
public static void main(String[] args) {
Eight1 o=new Eight1("旺财",13);
o.speak();
Eight1 o1=new Eight1("小强");
o1.speak();
/*
* 内存的运行原理
*
* 1:首先在内存当中出现栈和堆,在栈中main函数进入,产生o对象,在堆中就会产生地址(假设地址为:0x0067),
* 在堆中name,age就会进来,并且name,age会分别赋值为null,0;
* 2:然后构造函数Eight1(String name,int a)就会进栈,并且在局部变量中进行赋值name="旺财",age=13;
*
* 3.this(name); 这句代码的意思就是,当前对象进行初始化,把"旺财"通过this(当前对象)进行初始化,这样就把堆内存中的
* name赋值为了"旺财",然后出栈
*
* 4.this.age=a;通过this 来划分到底是个那个一个对象来进行初始化,this代表的就是当前对象,也就是地址(假设地址为:0x0067),
* 这样就能成功的划分到底是给谁来划分
*
* 5.运行完之后(初始化成功之后),就会把堆内存的地址(假设地址为:0x0067),给产生的o对象。
* */
}
}
this的小应用,比较是否是同龄人
class Person{
private String name;
private int age;
Nine1(){
name="baby";
age=1;
System.out.println("Person run");
}
Nine1(String name){
this.name=name;
}
Nine1(String name,int a){
this(name);
this.age=a;
}
public void speak(){
System.out.println(name+":"+age);
}
/*
* 判断是否是同龄人
* */
public boolean compare(Nine1 p){//Nine1这相当是一个人类对象
if(this.age==p.age){ //this代表调用这个方法的对象,代表传进来的对象
return true;
}else{
return false;
}
}
public static void main(String[] args) {
Person o=new Person("aa",30);
Person o1=new Person("zz",12);
boolean b=o.compare(o1);
System.out.println(b);//false
}
}