java必学必会之this关键字

 更新时间:2015年12月04日 10:08:26   转载 作者:孤傲苍狼  
java必学必会之this关键字,java中this的用法进行了详细的分析介绍,感兴趣的小伙伴们可以参考一下

一、this关键字

  

this是一个引用,它指向自身的这个对象。

看内存分析图:

  假设我们在堆内存new了一个对象,在这个对象里面你想象着他有一个引用this,this指向这个对象自己,所以这就是this,这个new出来的对象名字是什么,我们不知道,不知道也没关系,因为这并不影响这个对象在内存里面的存在,这个对象只要在内存中存在,他就一定有一个引用this。

看下面的例子分析:

package cn.galc.test;

public class Leaf {

  int i = 0;

  public 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 Leaf(100);
    leaf.increament().increament().print();
  }
}

在内存中分析main方法的执行过程

首先分析第一句话:Leaf leaf = new Leaf(100);

  程序执行到这里的时候,栈空间里面有一个变量leaf,它指向了我们new出来的在堆空间里面的Leaf对象。new这个Leaf对象的时候,调用了构造方法Leaf(),这个构造方法里面有一个形参i,所以在栈空间里面给构造方法分配有一小块内存,名字叫i用来装传递过来的实参。这里传过来的实参是100,所以i里面装的值就是100。得到这个值之后,构造方法继续执行,执行this.i = i;这里就是把栈空间里面的i的值通过值传递给Leaf对象里面的成员变量i,所以成员变量i的值也变成了100。内存中的布局如下图所示:

  

  构造方法执行完之后,为这个构造方法分配的内存消失,所以栈里面的i所标记的那一小块内存会消失。因此第一句话执行完之后,内存中的布局如下图所示:

  

接下来分析第二句话:leaf.increament().increament().print();

  首先逐个分析:leaf.increament(),这里是调用increament()方法,是对new出来的那个Leaf对象调用的,leaf是Leaf对象的引用对象,因此通过这个引用对象来调用increament()方法,即相当于是Leaf对象自己调用了increament()方法。increament()方法的定义如下:

Leaf increament(){
  i++;
  return this;

}

  因此Leaf对象调用increament()方法时,首先执行方法体里面的第一句话i++;这样就把Leaf对象的成员变量i的值由原来的100变成了101。此时的内存布局如下图所示。

  接下来执行方法体里面的第二句话:return this;

  这里把this作为返回值,当有返回值的时候,首先会在栈里面给这个返回值分配一小块临时的存储空间。这块存储空间里面的内容是this里面的内容。this指向它自身,所以栈内存里面的那块临时存储空间里面装的this也是指向堆内存里面的Leaf对象。

所以leaf.increament().increament().print();这句话里面的left.increament()这一小句话执行完之后,内存中的布局如下图所示。

  

  leaf.increament().increament().print();这句话里面的left.increament()这一小句话执行完之后,返回一个this,此时leaf.increament().increament().print();就相当于是this.increament().print();

  接着栈里面的存储在临时空间里面的this调用increament()方法,而this指的就是Leaf对象,所以又是Leaf对象调用increament()方法。Leaf对象调用increament()方法时,又会执行方法体里面的i++,所以此时i又由原来的101变成了102。然后又执行return this,所以栈内存里面又多了一块临时存储空间,里面装的值也是this,这个this又是指向堆内存里面的Leaf对象。因此此时这个Leaf对象有了四个指向他自己的引用对象。

  leaf.increament().increament().print();这句话里面的leaf.increament().increament()这一小句话执行完之后,都返回了一个this,所以此时的leaf.increament().increament().print();就相当于是这样子的:this.this.print();

  接下来又是栈里面的那个新的this调用print()方法,使用this来调用,那就相当于是Leaf对象来调用,Leaf对象自己调用print()方法将自己的i属性的值打印出来,所以打印出来的结果应该是102。

  因此main方法里面的整个程序执行完之后,内存中的布局如下图所示:

  

  this的总结:this一般出现在方法里面,当这个方法还没有调用的时候,this指的是谁并不知道。但是实际当中,你如果new了一个对象出来,那么this指的就是当前这个对象。对哪个对象调用方法,this指的就是调用方法的这个对象(你对哪个对象调用这个方法,this指的就是谁)。如果再new一个对象,这个对象他也有自己的this,他自己的this就当然指的是他自己了。

以图文相结合的方式为大家详细介绍java this关键字,希望能够帮助到大家更好地理解this关键字。

相关文章

  • java显示当前运行时的参数(java运行参数)

    java显示当前运行时的参数(java运行参数)

    这篇文章主要介绍了java显示当前运行时参数的示例(java运行参数),需要的朋友可以参考下
    2014-04-04
  • Spring+Vue整合UEditor富文本实现图片附件上传的方法

    Spring+Vue整合UEditor富文本实现图片附件上传的方法

    这篇文章主要介绍了Spring+Vue整合UEditor富文本实现图片附件上传的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • Spring Security登录添加验证码的实现过程

    Spring Security登录添加验证码的实现过程

    这篇文章主要介绍了Spring Security登录添加验证码的实现过程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • 微信小程序登录状态java后台解密

    微信小程序登录状态java后台解密

    这篇文章主要为大家详细介绍了微信小程序登录状态java后台解密,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-12-12
  • Java求两个正整数的最大公约数和最小公倍数

    Java求两个正整数的最大公约数和最小公倍数

    这篇文章主要介绍了输入两个正整数m和n,求其最大公约数和最小公倍数,需要的朋友可以参考下
    2017-02-02
  • 基于SpringBoot实现图片上传与显示

    基于SpringBoot实现图片上传与显示

    这篇文章主要为大家详细介绍了基于SpringBoot实现图片上传与显示,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-08-08
  • java常用工具类 数字工具类

    java常用工具类 数字工具类

    这篇文章主要为大家详细介绍了java常用工具类中的数字工具类,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-05-05
  • JAVA创建和销毁对象的方法

    JAVA创建和销毁对象的方法

    本篇文章主要介绍了JAVA创建和销毁对象的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02
  • SpringBoot 整合 Lettuce Redis的实现方法

    SpringBoot 整合 Lettuce Redis的实现方法

    这篇文章主要介绍了SpringBoot 整合 Lettuce Redis的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • Django之多对多查询与操作方法详解

    Django之多对多查询与操作方法详解

    这篇文章主要介绍了Django之多对多查询与操作方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05

最新评论