日期:2014-05-20  浏览次数:20744 次

Java中静态方法如何体现预装载性?
根据定义,类的静态方法,静态变量是在类装载的时候装载的。静态变量我能理解,预先加载一个内存区域。但是我无法理解静态方法的预装载性。静态方法中可以声明变量,这个变量是局部变量。例如:
Java code

public static void function(){
        int a=1;
}


这个静态方法中只是声明了一个局部变量a,没有其他任何操作。但是据我所知局部变量是在使用的时候才开辟内存,既然是这样,那么预加载静态方法时到底是进行的什么操作(请注意我这个方法中没有其他任何语句)?

还有一个问题,有多个语句同时调用这里的静态function()方法时,对于局部变量a到底是如何进行处理的?

------解决方案--------------------
预加载 不进行执行 a还没分配

每次调用都会在栈产生一个局部变量a
------解决方案--------------------
静态方法主要是可以脱离对象存在,如Integer.valueOf(int a)方法,如果存在一个a对应的Integer对象,那么就将这个对象返回,这个具有“构造方法”的作用。如果是一般方法是不可以脱离对象存在的。这是它的一个用途。还有就是工具方法,比如Math类,它没有必要构造一个对象来使用这些方法,因为这些方法并不改变任何字段。创建对象需要代价,我们可以通过这种方法避免。
------解决方案--------------------
方法里的局部变量执行的时候在栈区开辟空间,而静态方法里得代码是在类加载的时候开辟空间的,因为代码是每个实例共享的,没有必要为每个实习都去开辟一个代码空间
------解决方案--------------------
探讨

我明白静态方法的定义和用法,还有它的实际意义
但是我无法理解静态方法的本质,java虚拟机在加载静态方法的时候到底是做了什么?静态变量的加载和静态方法的加载我感觉肯定是有很大区别的。

------解决方案--------------------
方法加载,是把方法指令加载到方法区
方法调用的时候,到方法区取相关的指令执行
所以方法没有被调用,也就不会生成方法栈,局部变量也不会被加载,也就是方法没有被调用,不会给局部变量分配内存

多个语句同时调用该静态方法,就相当于有多个方法栈,每个局部变量在自己的方法栈中分配内存


------解决方案--------------------
《The Java Language Specifiction》James Gosling 有关于虚拟机的执行(包括虚拟机启动,加载类和接口,连接类和接口,初始化类和接口...)的详细过程,非几句话能说明白,我正在看,希望能帮助你