写在前面
本文隶属于专栏《100个问题搞定Java虚拟机》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!
本专栏目录结构和文献引用请见100个问题搞定Java虚拟机
解答
在 Java 中,每当一个对象创建后,Java 虚拟机都会给这个对象分配一个指向自身的引用,也就是 this。同时如果对象是子类对象,则还会有一个 super 引用指向当前对象的父类对象。
this 的本质是:编译器在调用某个实例方法时,实际上会把当前的实例对象的引用作为第一个参数传递给方法。
super 的本质是: invokespecial 指令。
补充
this 的作用
- 在类的方法定义中使用 this 关键字,表示使用该方法的对象的引用。
- 在一个类中,this 可以表示该类的当前实例。
- this 是对当前类对象的引用,对象只有被实例化才存在。
this 的实现原理
在任何实例方法里面,都可以通过“this”关键字访问到此方法所属的对象。
这个访问机制对Java程序的编写很重要, 而它的实现却非常简单,仅仅是通过 Javac 编译器 编译的时候把对this关键字的访问转变为对一个普通方法参数的访问, 然后在虚拟机调用实例方法时自动传入此参数而已。
因此在实例方法的局部变量表中至少会存在一个指向当前对象实例的局部变量,局部变量表中也会预留出第一个Slot位来存放对象实例的引用,方法参数值从1开始计算。
这个处理只对实例方法有效。
super的作用
- 如果子类在继承父类的非私有的方法和成员变量时,没有同名的方法和变量,可以直接通过名称使用父类的方法和变量。
- 如果子类存在与父类同名的方法和成员变量时,要想区别访问父类和自身的变量和方法,需要使用 super 关键字调用父类的方法和属性。
super 的实现原理
super 就是靠 invokespecial 指令来调用父类方法的。
invokespecial 指令的主要作用是,用于调用一些需要特殊处理的实例方法,包括实例初始化方法、私有方法和父类方法。
详情请见我的另一篇博客——Java虚拟机是如何识别目标方法的?