说起this关键字大家应该都不陌生
我们先来回顾一下this关键字。
1.this关键字主要有三个应用:
(1)this调用本类中的属性,也就是类中的成员变量;
(2)this调用本类中的其他方法;
(3)this调用本类中的其他构造方法,调用时要放在构造方法的首行。
我们今天先来了解第一个应用。
首先看一段代码
class Person
{
private String name;
private int age;
Person(String name)
{
this.name=name;
}
public void speak()
{
System.out.println(name+":"+age);
}
}
class Demo{
public static void main(String[] args)
{
Person p=new Person("haha");
p.speak();
Person p1=new Person("xixi");
p1.speak();
}
}初学者肯定有很多疑问,比如我自己:
p,p1都调用构造函数,那么初始化的时候,它们怎么能分清p的name是个p,而不是给p1
所以我们画个原理图来了解一下内部原理。
首先当new一个对象时候,p入栈,构造函数在堆中开辟了一块内存,如图:
这个时候,怎么把p和堆中的内存联系起来?这个时候this的作用就出来了。
后面会new很多对象,那么有了this后,谁调用构造函数就个谁初始化,用this作为判断依据。this指向哪个对象就给那个对象初始化。
所以p就找到了那块内存空间,然后弹栈,speak()函数进栈,出栈。p1同理也是这样的。
这个时候有人也许会问,那怎么判断speak()是哪个对象调用呢?
public void speak()
{
System.out.println(name+":"+age);
}这段代码起始隐藏了东西
public void speak()
{
System.out.println(this.name+":"+this.age);
}看图
还是通过this,speak指向了p这个对象。
在speak()中,并没定义name,age局部变量,使用的对象里面的,所以隐藏了一个this,没有重名就可以省略。
讲到这里是不是一目了然了?