全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Java关键字this(动力节点Java学院整理)

我们通常在用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关键字的使用详解  # 的是  # 句柄  # 是怎么  # 类中  # 就把  # 当我们  # 这块  # 很明显  # 小编  # 情况下  # 有什么  # 这一  # 是在  # 来了  # 在我  # 有个  # 却是  # 在此  # 我有  # 是这样 


相关文章: 宝塔建站教程:一键部署配置流程与SEO优化实战指南  如何基于云服务器快速搭建网站及云盘系统?  建站之星好吗?新手能否轻松上手建站?  深圳企业网站制作设计,在深圳如何网上全流程注册公司?  广州网站建站公司选择指南:建站流程与SEO优化关键词解析  魔毅自助建站系统:模板定制与SEO优化一键生成指南  c++怎么用jemalloc c++替换默认内存分配器【性能】  如何在搬瓦工VPS快速搭建网站?  宝华建站服务条款解析:五站合一功能与SEO优化设置指南  如何在腾讯云免费申请建站?  购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?  Android使用GridView实现日历的简单功能  成都网站制作公司哪家好,四川省职工服务网是做什么用?  家庭建站与云服务器建站,如何选择更优?  高防服务器租用首荐平台,企业级优惠套餐快速部署  香港服务器网站卡顿?如何解决网络延迟与负载问题?  南京网站制作费用,南京远驱官方网站?  如何规划企业建站流程的关键步骤?  建站主机选哪种环境更利于SEO优化?  已有域名如何免费搭建网站?  百度网页制作网站有哪些,谁能告诉我百度网站是怎么联系?  建站之星在线客服如何快速接入解答?  如何通过云梦建站系统实现SEO快速优化?  广德云建站网站建设方案与建站流程优化指南  C#怎么创建控制台应用 C# Console App项目创建方法  制作网站的基本流程,设计网站的软件是什么?  如何在Golang中使用encoding/gob序列化对象_存储和传输数据  电商平台网站制作流程,电商网站如何制作?  清除minerd进程的简单方法  如何获取免费开源的自助建站系统源码?  股票网站制作软件,网上股票怎么开户?  ,网页ppt怎么弄成自己的ppt?  手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?  如何将凡科建站内容保存为本地文件?  建站主机如何选?性能与价格怎样平衡?  深圳防火门网站制作公司,深圳中天明防火门怎么编码?  如何用wdcp快速搭建高效网站?  如何快速辨别茅台真假?关键步骤解析  西安专业网站制作公司有哪些,陕西省建行官方网站?  如何选择可靠的免备案建站服务器?  韩国服务器如何优化跨境访问实现高效连接?  网站制作知乎推荐,想做自己的网站用什么工具比较好?  如何选择适配移动端的WAP自助建站平台?  高端建站三要素:定制模板、企业官网与响应式设计优化  制作网站的软件下载免费,今日头条开宝箱老是需要下载怎么回事?  北京网站制作的公司有哪些,北京白云观官方网站?  公众号网站制作网页,微信公众号怎么制作?  如何用PHP工具快速搭建高效网站?  如何配置WinSCP新建站点的密钥验证步骤?  香港服务器部署网站为何提示未备案? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。