字节码文件中关于this和super的问题,求教大佬解惑

枠戢 2021-01-19 12:28:27
1. 昨天发现一个没有参数的实例方法的args_size=1,而静态方法并没有多出来的args_size,在想是不是实例方法多出来的其实是this属性?后来查书(深入理解JVM 6.3.7章节)发现确实如此,那么this是不是就是一个简单的局部变量,而不是我以前理解的一个特别高大上的特殊存在?
void m();
descriptor: ()V
flags:
Code:
stack=0, locals=1, args_size=1

2. 发现this之后我又在想super是不是也有这个待遇?可是简单的实验之后发现有这个待遇的只有this一个:
class Father {
void m(){}
}

class Son extends Father{
void m2(){}
}
class jvm.Son extends jvm.Father
minor version: 0
major version: 52
flags: ACC_SUPER
Constant pool:
#1 = Methodref #3.#14 // jvm/Father."<init>":()V
#2 = Class #15 // jvm/Son
#3 = Class #16 // jvm/Father
#4 = Utf8 <init>
#5 = Utf8 ()V
#6 = Utf8 Code
#7 = Utf8 LineNumberTable
#8 = Utf8 LocalVariableTable
#9 = Utf8 this
#10 = Utf8 Ljvm/Son;
#11 = Utf8 m2
#12 = Utf8 SourceFile
#13 = Utf8 Demo2.java
#14 = NameAndType #4:#5 // "<init>":()V
#15 = Utf8 jvm/Son
#16 = Utf8 jvm/Father
{
jvm.Son();
descriptor: ()V
flags:
Code:
stack=1, locals=1, args_size=1
0: aload_0
1: invokespecial #1 // Method jvm/Father."<init>":()V
4: return
LineNumberTable:
line 13: 0
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 this Ljvm/Son;

void m2();
descriptor: ()V
flags:
Code:
stack=0, locals=1, args_size=1
0: return
LineNumberTable:
line 14: 0
LocalVariableTable:
Start Length Slot Name Signature
0 1 0 this Ljvm/Son;
}
那么super是什么(实例常量还是局部变量或者其他)?
...全文
92 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
qybao 2021-01-19
  • 打赏
  • 举报
回复
1 this是个特殊指针(指向当前内存区域,它可以指向对象本身,还可以指向方法--构造方法),调用成员方法是会把this作为参数传入成员方法,非静态代码块也一样可以使用this,内部类也可以使用外部类的this,所以它并不是你所看到的那样,就是个局部变量。
2 super同上,只是super限制为指向父类内存区域的指针

wancjst 2021-01-19
  • 打赏
  • 举报
回复
super表示当前类的父类,super()表示当前类父类的构造方法
qq_39936465 2021-01-19
  • 打赏
  • 举报
回复
引用 楼主 枠戢 的回复:
那么super是什么(实例常量还是局部变量或者其他)?
this表示当前实例类,super表示父类,跟你说的局部变量,常量没关系,它们都是关键词。

62,625

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧