我是这样理解的:静态方法先在持久层加载,然后,在栈里面划分出一个方法空间给它, 然后在堆里面出现一个空间存放该静态方法的“方法首字母的地址值”,接着,在堆的另一个地方,出现一个该方法的对象?
不知道我这样理解对不对,请各位大师请教!!!
不知道我这样理解对不对,请各位大师请教!!!
解决方案 »
- EJB Rmi 超 时 问 题 真 的 是 让 人 万 念 俱 灰 啊~2 0 0分啊。
- java HashSet 用法
- 高分求JDBC ORACLE 资料(先给100收到后再给100)
- java中直接常量的问题
- <<thinking in java>>上的一个例子为什么编译有问题?
- 怎么执行这个main?
- 关于Jtable 的横向滚动问题
- 字节码文件->源文件? help!
- java.util.zip.*中的问题,很奇怪。
- weblogic中使用sendRedirect可不可以用相对路径?
- 新人求助 洗牌之后怎么按顺序发牌啊?
- Java中 是不是只有按值传递 和按引用传递?按址传递的说法错的吧?求高手肯定一下。
“静态方法先在持久层加载”,不知所云首先.class文件装载,会将class文件中的信息解析成厂商特定的数据结构,存在方法区当调用静态方法时,会使用invokestatic指令,其参数是该类的常量池索引,该索引指向一个Method,刚开始时,这个Method也只是字符串描述,包括方法所属类名,方法名,描述符等。第一次调用该方法时,会去查找该方法在方法区的位置,然后将常量池中该方法的地方替换成指针至于如何去查找方法,jvm实现可能会使用方法表,如果使用方法表就简单了,如果没有用方法表,它会按照该类,超类,实现的接口的顺序去查找方法的地址详细内容可以参考《深入Java虚拟机》第二版第八章
楼上回答的好,顶一个,补充两句:
LZ的问题确实不太明白,但是我想你是想弄清楚静态方法与普通方法执行时的区别吧?我觉得加载的话,楼上回答的很好了,执行的话主要有以下三点区别:
1) 用的指令不一样,静态方法用invokestatic,而普通方法有invokespecial, invokevirtual,CSR 292还新增了invokedanymic.
2)查找的方式不一样:静态方法肯定只在自己本身的class的常量区中取查找,而普通的方法还会搜索继承的类和接口。
3) 执行时带的变量不一样,这一点和C++的原理相似,就是静态方法执行时不会把本身对象压入栈作为参数,因为他不需要,而普通方法则需要本身对象(this指针)。