我们通常在用Java中的this关键字的时候,都知道this是代表正在调用这个类的方法的当前实例。通常情况下理解this关键字还是很容易的,但是在我初学的时候,有一个疑问却一直不能很清晰的理解,现在慢慢的理解了,就想把它记下来,也许有人和我有相同的疑问,说不定可以帮助到别人。我们还是先简单的看看通常情况下this的作用吧。比如下面的代码:
public class Leaf {
private int i = 0;
Leaf increment() {
i++;
return this;
}
void print() {
System.out.println("i = " + i);
}
public static void main(String[] args) {
Leaf x = new Leaf();
x.increment().increment().print();
}
}
在Leaf类的main方法中,我们new了一个Leaf实例 x,然后x实例调用increment()方法。如果increment()是普通的方法或者void方法,这个地方就没有什么值得我们研究的了。特殊的是,在increment()方法中,我们return的是一个this,这个this代表的就是我们刚刚创建的x。因为x正在调用increment()方法,所以,increment()方法this就很明显代表的是Leaf的x实例了。
这看起来没有什么可讨论的,this就是代表的调用该方法的实例x。可是,假如我们把main()函数修改成下面的样子
public static void main(String[] args) {
Leaf x = new Leaf();
x.increment().increment().print();
Leaf y = new Leaf();
y.increment().increment().print();
}
以上修改的代码中,我们增加创建了一个Leaf实例y,然后y也连续调用调用了两次increment()。现在问题来了,假如 x,y同时调用的increment()方法,那么this到底能代表谁呢?你可能会觉得这有什么问题,x调用increment()方法,this就代表x, y调用increment()方法,this就代表y。可问题是,当我们讲调用方法的时候,在jvm层面上是找到Leaf类中increment()方法所在的内存地址,然后在java虚拟机栈中创建栈帧.
然后在栈帧中执行方法里面的代码。现在看到了吧,也就是说,在jvm执行方法层面,没有所谓的x调用,y调用了,那么,方法中的this到底是怎么确定指向哪个实例的呢?
我们还是来看看Leaf类字节码中是怎么展示的,是不是我们漏了什么,如果我们没有把x实例或者y实例传递到方法里面去,那么,在jvm执行方法的时候,是不可能知道this具体指向哪个实例的。
到这里,我们看到在increment()方法中,编码中没有参数,但是在字节码里面却显示参数个数为1,仔细想想,结果已经很明显了:jvm在执行编译的时候,在实例方法中,会默认隐藏的传递一个参数,这个参数就是当前调用的实例本身。比如x调用,隐藏就把x传过去,y调用,就把y传过去。所以,我们的this才能在jvm执行方法层面确定到底指向的是谁。
上面的结论是我们自己推断出来的,有没有那本书对这个有详细的描述呢?《java编程思想》里面,对这块是这样描述的:
假定我们在一个方法的内部,并希望获得当前对象的句柄。由于那个句柄是由编译器“秘密”传递的,所以没有标识符可用。然而,针对这一目的有个专用的关键字:this。
在里面讲的这个编译器秘密传递的句柄,就是我们这里的这个隐藏参数。
到此为止,关于this的描述想必已经很清楚了,我们在jvm层面对它进行了理解。那么,各位有没有兴趣在看下下面的这个例子,想想这个基类B中的this代表了什么呢?
public class B {
public B() {
System.out.println(this.getClass().getSimpleName());
System.out.println(((A) this).a);
}
}
public class A extends B {
public int a = 100;
public A() {
a = 200;
}
public static void main(String[] args) {
new A();
}
}
这个例子原本是为了了解java具有继承结构的时候类是怎么完成初始化的,可是这里面的B类中的构造函数比较特殊:B类中的构造函数中的this输出的SimpleName是A。通常我们遇到的情况,B类中的this输出的SimpleName应该是B,可是这里却是A?为什么?
在上面我们讲this的过程中,其实已经涉及到这块了,在调用java方法创建栈帧的时候,jvm会秘密的传递一个当前实例。所以,当我们在执行A的构造函数的时候,默认会调用父类B的构造函数,在调用父类B构造函数的时候,秘密的传进去的当前实例是 A的实例----因为是在A的构造函数中调用的B,所以,这个地方的this反而代表了A。
以上所述是小编给大家介绍的Java关键字this(动力节点Java学院整理),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
# java
# this
# 关键字
# java方法及this关键字原理分析详解
# Java的方法和this关键字如何理解与应用
# Java基础之this关键字的使用
# 关于java关键字this和super的区别和理解
# Java this 关键字的使用方法详解
# java中this与super关键字的使用方法
# 深入理解java中this关键字的使用
# Java this关键字的使用详解
# 的是
# 句柄
# 是怎么
# 类中
# 就把
# 当我们
# 这块
# 很明显
# 小编
# 情况下
# 有什么
# 这一
# 是在
# 来了
# 在我
# 有个
# 却是
# 在此
# 我有
# 是这样
相关文章:
高防服务器如何保障网站安全无虞?
湖北网站制作公司有哪些,湖北清能集团官网?
电脑免费海报制作网站推荐,招聘海报哪个网站多?
Android自定义listview布局实现上拉加载下拉刷新功能
网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?
h5网站制作工具有哪些,h5页面制作工具有哪些?
小型网站制作HTML,*游戏网站怎么搭建?
如何在西部数码注册域名并快速搭建网站?
黑客如何通过漏洞一步步攻陷网站服务器?
如何在阿里云ECS服务器部署织梦CMS网站?
nginx修改上传文件大小限制的方法
如何配置IIS站点权限与局域网访问?
如何快速生成专业多端适配建站电话?
如何用花生壳三步快速搭建专属网站?
公司网站设计制作厂家,怎么创建自己的一个网站?
如何在阿里云域名上完成建站全流程?
专业公司网站制作公司,用什么语言做企业网站比较好?
如何在阿里云虚拟服务器快速搭建网站?
浅析上传头像示例及其注意事项
如何在VPS电脑上快速搭建网站?
教学网站制作软件,学习*后期制作的网站有哪些?
建站主机核心功能解析:服务器选择与网站搭建流程指南
如何基于PHP生成高效IDC网络公司建站源码?
如何通过云梦建站系统实现SEO快速优化?
建站主机选虚拟主机还是云服务器更好?
,有什么在线背英语单词效率比较高的网站?
如何基于云服务器快速搭建个人网站?
公众号网站制作网页,微信公众号怎么制作?
python的本地网站制作,如何创建本地站点?
网站制作需要会哪些技术,建立一个网站要花费多少?
建站之星代理费用多少?最新价格详情介绍
如何快速搭建FTP站点实现文件共享?
h5在线制作网站电脑版下载,h5网页制作软件?
如何通过虚拟机搭建网站?详细步骤解析
如何快速搭建高效香港服务器网站?
新网站制作渠道有哪些,跪求一个无线渠道比较强的小说网站,我要发表小说?
网站网页制作专业公司,怎样制作自己的网页?
如何快速登录WAP自助建站平台?
山东云建站价格为何差异显著?
标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?
如何在橙子建站上传落地页?操作指南详解
制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?
如何用y主机助手快速搭建网站?
如何用IIS7快速搭建并优化网站站点?
齐河建站公司:营销型网站建设与SEO优化双核驱动策略
如何通过西部数码建站助手快速创建专业网站?
如何在万网自助建站中设置域名及备案?
韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南
家庭建站与云服务器建站,如何选择更优?
全景视频制作网站有哪些,全景图怎么做成网页?
*请认真填写需求信息,我们会在24小时内与您取得联系。