当前位置: 首页 > 编程日记 > 正文

Java基础学习总结(9)——this关键字

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

一、this关键字

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

看内存分析图:

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

看下面的例子分析:

复制代码
 1 package cn.galc.test;
 2 
 3 public class Leaf {
 4 
 5     int i = 0;
 6 
 7     public Leaf(int i) {
 8         this.i = i;
 9     }
10 
11     Leaf increament() {
12         i++;
13         return this;
14     }
15 
16     void print() {
17         System.out.println("i = " + i);
18     }
19 
20     public static void main(String[] args) {
21         Leaf leaf = new Leaf(100);
22         leaf.increament().increament().print();
23     }
24 }
复制代码

在内存中分析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对象调用的,leafLeaf对象的引用对象,因此通过这个引用对象来调用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就当然指的是他自己了。

转载于:https://my.oschina.net/zhanghaiyang/blog/595936

相关文章:

转贴:雅虎公司C#笔试题,看看你能解答多少

这是刚在在网上看到了,觉得这些题目出得真不错,能考出一个程序员的基本功。所以先发在这里,做个备份,以后慢慢来做(偶好像只能免强及格哦,呵呵,关于网络的题目太多了,偶不太熟啊&…

亿级PV请求的三种负载均衡技术

在互联网不断渗透到生活中的今天,各种各样的网络服务存在在我们身边,他们的访问流量也是大得惊人。一个大型网站(百万PV以上)想要正常访问,单单靠一台服务器是不可能提供稳定服务的。这时候就需要用负载均衡技术将海量…

The Six Best Practices(1~3)

前几期的图文我们介绍了软件工程中常见的问题,分析了产生这些问题的根本原因,引出了软件工程中的六个最佳经验。今天我们具体介绍这些最佳经验的内容。

Java项目命名规范

2019独角兽企业重金招聘Python工程师标准>>> 一、命名规范 1、 项目名全部小写 2、 包名全部小写 3、 类名首字母大写,如果类名由多个单词组成,每个单词的首字母都要大写。 如:public class MyFirstClass{} 4、 变量名、方法名首字…

一道数据结构算法题

现有一个链表,证明如果存在环,则:使用两个指针同时前进但步长不一样,则能够在有限步之后能够相逢。题目的意思是我归纳出来的,我的解题思路是这样的:能够相下逢的意思是:在走了x步以后&#xff…

win7系统下载 ghost win7 Sp1 32位纯净3月版

win7系统下载 ghost win7 Sp1 32位纯净3月版软件名称: Ghost Win7 Sp1 32位纯净3月版软件语言: 简体中文软件大小: 3.81大小: GB发布日期: 2017-03-21文件名称: ZJY_Ghost_win 7_X86_CJ201703.GHOM D 5: C21A7A17D8C2568A05844C5…

The Six Best Practices(4~6)

昨天图文介绍了The Six Best Practices的前三个经验:迭代化开发、需求管理、基于构件的体系构架,今天介绍后面的三个经验:可视化建模、持续的质量验证和变更管理。

代码生成器前戏 之 数据库元数据

总结:代码生成器大致有两种方式,1.根据po 生成 表 结构 等系列类,如 Hibernate自动生成 2.根据表生成 po 等系列类。其实实际 开发时候 多半还是 先设计好表,然后生成 的情况多。 元数据:描述数据的数据,就…

有感于框架设计难,实施框架更难!

很久没有写了,不能怪没有时间,只是自己太懒。这两天休息,有时间重新回顾一下项目的设计,从目前的开发情况看,最早设计的一些编程框架,并没有很好的遵守,看上去比较零乱,这个可能由于…

六个最佳的软件工程实践(基于构件的体系结构、可视化建模)

昨天图文介绍了迭代化开发和需求管理,今天我们介绍基于构件的体系结构和可视化建模。基于构件的体系结构是软件开发中最体现创造力的地方,可以通过“修建桥梁”来理解为什么要贯彻基于构件的体系结构以指导我们每次开发的演进增量过程。可视化建模是为了…

通讯组基本管理任务一

经常收发邮件的人都有同感:很多时候都需要向一组人发送邮件。如果一封封地发送,不仅耽误时间,而且很容易出错,将邮件发送给不应该接受邮件的收件人。Exchange Server 2010为了方便用户使用,通过“通讯组”和“地址列表…

无人驾驶相关数据集

普林斯顿大学人工智能自动驾驶汽车项目: 代码V1:http://deepdriving.cs.princeton.edu/DeepDrivingCode_v1.zip 代码V2: http://deepdriving.cs.princeton.edu/DeepDrivingCode_v2.zip 训练集(50G):http://…

六个最佳的软件工程实践(持续的质量验证、变更管理)

昨天图文介绍了基于构件的体系结构以及可视化建模,今天我们介绍六个最佳工程实践的最后两个,持续的质量验证以及变更管理。持续的质量验证是伴随迭代化开发而进行的不断验证,且每次迭代的测试集合都是不断递增的。质量验证不仅从功能方面要满…

css层叠样式表(一)

今天研究了下css。这东东入门不算难。可是想写出好的样式就得有很深的功底了。按照老大给网址,12天学会网页设计。做下总结吧。css通过div(层)来定位,通过层的margin,padding,border等属性来控制板块的间距。常用的模型是盒状模型…

aspx页面使用ajax遇到try catch中使用Response.End()报错

1、使用Ajax接收数据,在返回Response.Write()后应该调用Response.End()才能将数据写入到调用的页面,才能被jQuery的回调函数获取到返回的JSON数据 2、在try--catch里面不能用Response.End(),否则会报错:由于代码已经过优化或者本机框架位于调…

GO是更好的编程语言吗?

引言 团队有项目考虑用GO重写,所以花了些时间调研GO。 第一次接触GO是2年前,17年3月份,全职钻研一周,彼时C中毒太深,内心排斥其他编程语言,看其他语法总觉得有点怪,而且有“C/C能做任何事&#…

定位DIV滚动条

如果由于table中有一个下拉框,还有一个treeview时,treeview的所有节点都是取于下拉框的下拉选项来的,所以在第一定位这之后,当选择其他下拉框中其他的选项时,DIV的scrollTop值是会一直保存前一个步聚DIV滚动条所在的位…

JS作用域相关知识(#精)

在学习《你不知道的JS》一书中,特将作用域相关知识在此分享一下: #说到作用域,就不得不提到LHS查询和RHS查询: 1)如果查询目的是对变量进行赋值,则使用LHS查询 2)如果查询目的是获取变量的值,则使用RHS查询 作用域的查询都会从当前…

RUP within the context of the Six Best Practices

前面几期图文介绍了软件工程中常见的问题,以及找到它们的根本原因,提出了在软件工程实践中总结出来的六个最佳工程实践。迭代化开发、需求管理、基于构件的体系结构、可视化建模、持续的质量验证、变更管理。今天我们介绍Rational公司的RUP,看…

排序算法java版,速度排行:冒泡排序、简单选择排序、直接插入排序、折半插入排序、希尔排序、堆排序、归并排序、快速排序...

先推荐一篇关于排序算法的文章:http://www.cppblog.com/guogangj/archive/2009/11/13/100876.html 本文思路部分来源于上篇文章,但测得的结果似乎不大相同,不知是因为java的缘故还是因为我算法的缘故,欢迎拍砖。 复习排序&#xf…

项目存档管理规范

项目存档管理规范 在我们开发过很多个项目之后,每个项目都会累积下很多源码、文档等,查找和整理起来很不方便,如果我们又要同时工作于多个项目的话,情况会更糟。所以对每个项目的各种档案进行有效管理很有必要,从公司层…

review what i studied `date` - 2017-4-12

python 连接字符串 int srt >>> a 1 >>> b xuhui >>> a b Traceback (most recent call last):File "<stdin>", line 1, in <module> TypeError: unsupported operand type(s) for : int and str >>> b str(a)…

StaticFactoryMethod_Level1

以下代码是“简单工厂模式”的第一个例子&#xff1a;

逃离深圳,一个程序员的选择

到新公司上班也已经一个多月了&#xff0c;上周刚刚交了首付&#xff0c;总价50多万&#xff0c;97个平方的房子还外送8个平方。为了不忘记这次的选择&#xff0c;也为了记录这次选择的过程&#xff0c;特撰文如下。 自从得知老婆怀孕后&#xff0c;那是相当高兴&#xff0c;但…

弹出窗口(对话框)

对话框分为三种&#xff1a;window.open方法 无模式对话框 有模式对话框 第一&#xff1a;OPEN方法 <script>functionopen_cate(){ window.open("OpenUp.aspx","","toolbar0,location0,directories0,status0, menubar0,scr…

隐藏系统保留区

为了下午的装机活动自己就安了一个老毛桃&#xff0c;制作启动盘完毕后发现电脑中的“系统保留”盘出来了&#xff0c;为什么会出现这个盘呢&#xff1f; 当笔记本安装Windows7系统时会自己主动产生一个几百兆的系统保留分区。里面保存着系统/磁盘引导的数据。有些笔记本在出厂…

StaticFactoryMethod_Level2

以下代码是“简单工厂模式”的第二个例子&#xff1a;

06- web兼容性测试

稍后更新。。转载于:https://www.cnblogs.com/Chamberlain/p/11064664.html

話說我們家姚明

已經讀三年級了,成績不錯,有目共睹!最近三場比賽連續三次得分在30分以上...呵呵~在NBA那個高手如雲的地方如此出色! ^_^#好強~ 真的好強!!麥迪那個軟蛋,干脆把他賣掉得了!拿高工資不做事的人.. 凸-_-转载于:https://www.cnblogs.com/tohen/archive/2006/03/09/346286.html

20145240《网络对抗》MSF基础应用

MSF基础应用 一个主动攻击&#xff0c;如ms08_067 启动msfsearch ms08_067&#xff0c;查找相应的漏洞&#xff0c;查询可攻击的模块。根据上述漏洞的模块use exploit/windows/smb/ms08_067_netapi选择该模块接下来查看相应的攻击载荷&#xff0c;首先我们可以查看可使用的载荷…