在类的方法定义中使用的this关键字代表使用该方法的对象的引用,this指向的是自身对象的引用,我们可以通过一个小例子分析一下内存分配情况:
代码展示:
public class Leaf{
int i = 0;
Leaf ( int i ){ this.i=i; }
Leaf increament(){
i++;
return this;
}
void print() {
System.out.println(“i = ” + I );
}
Public static void main(String [] args){
Leaf leaf = new (100);
leaf.increament().increament().print();
}
}
内存分析:
首先,栈空间中有个leaf,它指向我们新new出来的Leaf,其Leaf分配在堆空间中;
其次,调用Leaf的构造方法,在栈空间里分配构造方法的形参i,其值为100;在Leaf中有成员变量i,然后把栈里形参i的值赋给堆空间Leaf成员变量i(为100),构造方法完成,栈中的形参i消失;
再次,执行leaf.increament().increament()第一个ncreament(),其i++,则i变为101;return在我们栈空间分配一个临时的内存,这块内容是this的内容,this指向其对象自身,则在栈空间分配的这个临时空间也指向该对象;
然后,执行leaf.increament().increament()第二个ncreament(),其是对占内存分配的临时空间调用,即相当于对自身对象继续调用,此时i为102;接着return this,则又重复上面的过程我就不在重复解说,图示说明;
最后,调用print()方法,打印输出结果:
下面我们就介绍一下,this的几种用法:
(1) 当成员变量和构造方法中的参数重名时,在方法中使用this表明类中的成员变量。
代码如下:
public class Leaf{
int i = 0;
Leaf ( int i){
this.i = i;
}
}
(1) 把自己当参数传递
代码如下:
class Fruit{
Fruit(){
New Apple(this).print; //调用B的方法
}
void print(){
System.out.println(“欢迎来到水果世界”);
}
}
class Apple{
Fruit fruit;
Apple ( Fruit fruit){
this.fruit = fruit;
}
void print(){
a.print();//调用Fruit的方法
b.System.out.println(“欢迎来到苹果世界”);
}
}
在这里,对象Fruit的构造函数中,用new Apple(this)把对象Fruit自己当做参数传递给了对象Apple的构造函数。
3、在构造函数中,通常this可以调用同一类中别的构造函数。
代码如下:
Public class Person{
String name;
int age;
String sex;
Person (string n, int g , string s){
name = n;
age = g;
sex = s;
}
Person ( string n ,I nt g){
This(n,g,”男”)
}
4、this同时传递多个参数。
Public class Person{
String name;
int age;
static void show( Person person){
System.out.println( person.name + “,” + person.age);
}
void see(){
show(this);
}
}
这里相当于吧当前实例化的person传给了show()方法。
5、当用到一些内部类或匿名类,如事件处理。在匿名类中用this时,这个this指的是匿名类或内部类本身。这时如果我们要使用外部类的方法和变量的话,则应该加上外部类的类名。
Public class Person{
Person ( ) {
Thread thread = new Thread ( ){
Void run ( ){
Person.this.run();//调用外部类的方法
}
}
void run ( ){
System.out.println(“跑”);
}
}
在这里,thread 是一个匿名类对象,在它的定义中,它的 run 函数里用到了外部类的 run 函数。这时由于函数同名,直接调用就不行了。这时有两种办法,一种就是把外部的 run 函数换一个名字,但这种办法对于一个开发到中途的应用来说是不可取的。那么就可以用这个例子中的办法用外部类的类名加上 this 引用来说明要调用的是外部类的方法 run。
总之,this不管有几种用法,它都是代表使用该方法的对象的引用。