看到这个标题的读者,在你们的心里多多少少都有自己的答案,下面说一下我的答案.
在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. 因此也就解答了文章开头提出的问题.