写在前面

本文隶属于专栏《100个问题搞定Java虚拟机》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!

本专栏目录结构和文献引用请见100个问题搞定Java虚拟机

解答

在 Java 中,每当一个对象创建后,Java 虚拟机都会给这个对象分配一个指向自身的引用,也就是 this。同时如果对象是子类对象,则还会有一个 super 引用指向当前对象的父类对象。this 的本质是:编译器在调用某个实例方法时,实际上会把当前的实例对象的引用作为第一个参数传递给方法。
super 的本质是: invokespecial 指令。

补充

this 的作用

  1. 在类的方法定义中使用 this 关键字,表示使用该方法的对象的引用。
  2. 在一个类中,this 可以表示该类的当前实例。
  3. this 是对当前类对象的引用,对象只有被实例化才存在。

this 的实现原理

在任何实例方法里面,都可以通过“this”关键字访问到此方法所属的对象。

这个访问机制对Java程序的编写很重要, 而它的实现却非常简单,仅仅是通过 Javac 编译器 编译的时候把对this关键字的访问转变为对一个普通方法参数的访问, 然后在虚拟机调用实例方法时自动传入此参数而已。

因此在实例方法的局部变量表中至少会存在一个指向当前对象实例的局部变量,局部变量表中也会预留出第一个Slot位来存放对象实例的引用,方法参数值从1开始计算。

这个处理只对实例方法有效。

super的作用

  1. 如果子类在继承父类的非私有的方法和成员变量时,没有同名的方法和变量,可以直接通过名称使用父类的方法和变量。
  2. 如果子类存在与父类同名的方法和成员变量时,要想区别访问父类和自身的变量和方法,需要使用 super 关键字调用父类的方法和属性。

super 的实现原理

super 就是靠 invokespecial 指令来调用父类方法的。

invokespecial 指令的主要作用是,用于调用一些需要特殊处理的实例方法,包括实例初始化方法、私有方法和父类方法。

详情请见我的另一篇博客——Java虚拟机是如何识别目标方法的?

一句话搞懂Java中this和super的实现原理相关推荐

  1. java 自旋锁_搞懂Java中的自旋锁

    轻松搞懂Java中的自旋锁 前言 在之前的文章<一文彻底搞懂面试中常问的各种"锁">中介绍了Java中的各种"锁",可能对于不是很了解这些概念的同学 ...

  2. 一篇文章让你搞懂Java中的静态代理和动态代理

    文章目录 什么是代理模式 代理的优缺点 静态代理 动态代理 InvocationHandler 接口 和 invoke 方法介绍 静态代理和动态代理的区别 什么是代理模式 代理模式是常用的java设计 ...

  3. Java基础学习系列--(七)彻底搞懂java中的【异常、线程】的使用

    第一章 异常 1.1 异常概念 异常,就是不正常的意思.在生活中:医生说,你的身体某个部位有异常,该部位和正常相比有点不同,该部位的功能将受影响.在程序中的意思就是: 异常 :指的是程序在执行过程中, ...

  4. 四十七、面试前,必须搞懂Java中的线程池ThreadPoolExecutor(上篇)

    @Author:Runsen @Date:2020/6/9 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏艰 ...

  5. 一文彻底搞懂Java中的值传递和引用传递!

    关于Java中方法间的参数传递到底是怎样的.为什么很多人说Java只有值传递等问题,一直困惑着很多人,甚至我在面试的时候问过很多有丰富经验的开发者,他们也很难解释的很清楚. 我很久也写过一篇文章,我当 ...

  6. java中编码问题_[干货预警]一次搞懂Java中的编码问题

    编码问题一直是一个困扰程序员的问题,尤其是对于java程序员.因为java的跨平台特性,经常需要在多个编码之间进行转换. 下面详细讲一讲java中的编码问题 一.为什么要编码 长话短说,原因如下: 1 ...

  7. 来吧,一文彻底搞懂Java中最特殊的存在——null

    没事的时候,我并不喜欢逛 P 站,而喜欢逛 programcreek 这些技术型网站,于是那天晚上,在夜深人静的时候,我就发现了一个专注基础但不容忽视的主题.比如说:Java 中的 null 到底是什 ...

  8. 教妹学Java(九):一文搞懂Java中的基本数据类型

    大家好,我是沉默王二,一个和黄家驹一样身高,和刘德华一样颜值的程序员.本篇文章通过我和三妹对话的形式来谈一谈"Java 中的数据类型". 教妹学 Java,没见过这么有趣的标题吧? ...

  9. 彻底搞懂 Java 中的注解 Annotation

    Java注解是一系列元数据,它提供数据用来解释程序代码,但是注解并非是所解释的代码本身的一部分.注解对于代码的运行效果没有直接影响. 网络上对注解的解释过于严肃.刻板,这并不是我喜欢的风格.尽管这样的 ...

最新文章

  1. 这两天用到的Jmeter录制
  2. [YTU]_2915(Shape系列-1)
  3. spring之java配置(springboot推荐的配置方式)
  4. 改变openssl的环境变量linux,ECS Linux 安装配置openssl的具体过程
  5. 牛客假日团队赛5 L Catch That Cow HDU 2717 (BFS)
  6. mint-ui修改样式的小技巧
  7. java web 配置教程,javaWeb实战教程0-环境配置,javaweb实战教程0-
  8. HDU4474_Yet Another Multiple Problem
  9. ECshop仿顺丰优选综合购物商城平台源码旗舰版+团购+触屏版+微信支付
  10. IDEA JetBrains Mono 字体安装
  11. 何謂 Raw Data ?
  12. 电脑服务器注册表,(恢复Windows服务器注册表的系统配置单元.doc
  13. u 只读 盘 突然_u盘变成只读方式了,怎么办
  14. 美团西安美食部分爬虫(修改版)(python)
  15. struts2 通配符的配置方式
  16. 自建电驴服务器,电驴服务器怎么连接 eMule连接服务器教程
  17. JavaScript实现在HTML中的粒子文字特效
  18. 华人女性社交社区的存在可能
  19. 请将标为Service Pack 2 CD-ROM的光盘插入CD-ROM驱动器(D:),然后单击确定。如何解决? 在windows server 2003服务器上。
  20. html5 swipe滑动选择身高,Swipe 移动端滑动插件使用详解

热门文章

  1. 从心理学角度浅谈《最后生还者2》的剧情设计问题
  2. 3DMax更改视口布局和最大化快捷键(二)
  3. 全局变量的声明、定义及用法
  4. 华为mate5鸿蒙,华为Mate50Pro概念机:立体真全屏+浴霸5镜头,鸿蒙能救华为吗
  5. 雪狼湖-记忆中最后一个POP音乐
  6. linux设置用户和群主,Linux的用户和组群管理
  7. 算法竞赛入门经典(第2版)习题5-5 复合词 UVa10391
  8. android 字节流读取,使用字节流读/写文件
  9. GitHub上标星75k+超牛的《Java面试突击版》,分享PDF离线版
  10. wps表格-使用通配符进行高级查找