为什么在静态方法中不能使用this
2020-10-24 本文已影响0人
赵信信官属
看到这个标题的读者,在你们的心里多多少少都有自己的答案,下面说一下我的答案.
在JVM的运行时数据区中有个虚拟机栈(或Java栈),在它的里面是由栈帧'叠加'而成.
栈帧由局部变量表,操作数栈,动态连接,方法返回地址等组成.
那么我们就从局部变量表角度解答下这个问题.
我这里安装了jclasslib Bytecode viewer插件,方便查看字节码.

public static void query(String year) {
int month = 12;
String address = "Jiangsu";
System.out.println(address);
}
public void shadow(String year) {
int month = 12;
String address = "Jiangsu";
System.out.println(address);
}
执行编译

查看字节码


详细看下两个方法的局部变量表,如下
query方法的局部变量表

shadow方法的局部变量表

我们发现,非静态方法shadow的局部变量表中有this,而在静态方法query的局部变量表中没有this. 因此也就解答了文章开头提出的问题.