我是这样理解的:静态方法先在持久层加载,然后,在栈里面划分出一个方法空间给它, 然后在堆里面出现一个空间存放该静态方法的“方法首字母的地址值”,接着,在堆的另一个地方,出现一个该方法的对象?
不知道我这样理解对不对,请各位大师请教!!!

解决方案 »

  1.   

    有点像,但不是你说的那样
    “静态方法先在持久层加载”,不知所云首先.class文件装载,会将class文件中的信息解析成厂商特定的数据结构,存在方法区当调用静态方法时,会使用invokestatic指令,其参数是该类的常量池索引,该索引指向一个Method,刚开始时,这个Method也只是字符串描述,包括方法所属类名,方法名,描述符等。第一次调用该方法时,会去查找该方法在方法区的位置,然后将常量池中该方法的地方替换成指针至于如何去查找方法,jvm实现可能会使用方法表,如果使用方法表就简单了,如果没有用方法表,它会按照该类,超类,实现的接口的顺序去查找方法的地址详细内容可以参考《深入Java虚拟机》第二版第八章
      

  2.   


    楼上回答的好,顶一个,补充两句:
    LZ的问题确实不太明白,但是我想你是想弄清楚静态方法与普通方法执行时的区别吧?我觉得加载的话,楼上回答的很好了,执行的话主要有以下三点区别:
    1) 用的指令不一样,静态方法用invokestatic,而普通方法有invokespecial, invokevirtual,CSR 292还新增了invokedanymic.
    2)查找的方式不一样:静态方法肯定只在自己本身的class的常量区中取查找,而普通的方法还会搜索继承的类和接口。
    3) 执行时带的变量不一样,这一点和C++的原理相似,就是静态方法执行时不会把本身对象压入栈作为参数,因为他不需要,而普通方法则需要本身对象(this指针)。
      

  3.   

    你不要凭空想象啦《深入java 虚拟机(第二版)》 说的应该是非常权威了 ,推荐你看看吧不过已经绝版,电子版的也不错