看到这个标题的读者,在你们的心里多多少少都有自己的答案,下面说一下我的答案.

在JVM的运行时数据区中有个虚拟机栈(或Java栈),在它的里面是由栈帧’叠加’而成.
栈帧由局部变量表,操作数栈,动态连接,方法返回地址等组成.
那么我们就从局部变量表角度解答下这个问题.

我这里安装了jclasslib Bytecode viewer插件,方便查看字节码.
为什么在静态方法中不能使用this_JVM

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);
   }

执行编译

为什么在静态方法中不能使用this_JVM_02
查看字节码
为什么在静态方法中不能使用this_JVM_03

为什么在静态方法中不能使用this_JVM_04
详细看下两个方法的局部变量表,如下

query方法的局部变量表
为什么在静态方法中不能使用this_1024程序员节_05
shadow方法的局部变量表
为什么在静态方法中不能使用this_JVM_06
我们发现,非静态方法shadow的局部变量表中有this,而在静态方法query的局部变量表中没有this. 因此也就解答了文章开头提出的问题.​


 为什么在静态方法中不能使用this_1024程序员节_07