飞道的博客

站在编译器的角度理解this关键字

252人阅读  评论(0)

this关键字在Java语言里非常重要,也是一个高频使用的关键字,但是很多人并不理解this关键字的真正含义,只是简单机械的使用。本文将带你从编译器的视角,深度解读this关键字,知其然,并知其所以然。

1、this关键字的起源

我们先来讨论一个有趣的问题,假如有一个BooK类,它有一个sell()方法,Book类创建两个对象,分别是book1和book2,当sell()方法被调用的时候,书的数量就减少一本,问题来了哈!编译器是如何知道sell()方法被book1调用的还是被book2调用的呢?


  
  1. public class Book {
  2. private int bookNumber; //书的数量
  3. public void sell(int price){
  4. bookNumber = bookNumber - 1; //卖出去一本,书的数量就减1
  5. }
  6. }

  
  1. public class Main {
  2. public static void main(String[] args){
  3. //创建对象
  4. Book book1 = new Book();
  5. Book book2 = new Book();
  6. book1.sell( 10);
  7. book2.sell( 20);
  8. }
  9. }

原因就在于编译器在后台对sell()方法做了一个小改动,它把调用该方法的对象作为第一个参数传递给了sell()方法。所以上述两个对象对方法的调用就变成了这样:


  
  1. BooK.sell(book1, 10);
  2. Book.sell(book2, 20);

这是编译器的内部表达形式,不需要我们自己写成这样。我们如何使用sell()方法传过来的对象呢?为此,有个专门的关键字就是this。this关键字表示对“调用方法的那个对象”的引用,只能在类的内部使用。

2、this的使用场景

我们来为Book类增加一个书籍数量初始化方法setBookNumber,在setBookNumber(int bookNumber)中,当形参int bookNumber和类的成员变量private int bookNumber重名时,我们就可以使用this关键字,调用类的内部成员变量,对成员变量bookNumber赋值。


  
  1. public class Book {
  2. private int bookNumber; //书的数量
  3. public void setBookNumber(int bookNumber) {
  4. this.bookNumber = bookNumber;
  5. }
  6. public void sell(int price){
  7. bookNumber = bookNumber - 1; //卖出去一本,书的数量就减1
  8. }
  9. }

此外,我们也可以在类的内部通过this关键字,返回当前对象。


  
  1. /******************************************************************************************
  2. * 需要Java学习视频和项目外包信息的小伙伴,可以关注我的公众号【码农充电站】或者联系我的微信
  3. * 公众号:码农充电站
  4. * 作者微信:it1529577
  5. *****************************************************************************************/

 


转载:https://blog.csdn.net/l312770312/article/details/115533289
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场