而静态方法无此隐含参数,因此也不需要new对象,只要class文件被ClassLoader load进入JVM的stack,该静态方法即可被调用。 当然此时静态方法是存取不到heap 中的对象属性的。 总结一下该过程:当一个class文件被ClassLoader load进入JVM后,方法指令保存在stack中,此时heap区没有数据。 然后程序技术器开始执行指令,如果是静态方法,直接依次执行指令代码,当然此时指令代码是不能访问heap 数据区的; 如果是非静态方法,由于隐含参数没有值,会报错。因此在非静态方法执行前,要先new对象,在heap中分配数据, 并把stack中的地址指针交给非静态方法,这样程序技术器依次执行指令,而指令代码此时能够访问到heap数据区了。 再说一下静态属性和动态属性: 前面提到对象实例以及动态属性都是保存在heap 中的,而heap必须通过stack中的地址指针才能够被指令(类的方法)访问到。 因此可以推断出:静态属性是保存在stack中的(基本类型保存在stack中,对象类型地址保存在stack,值保存在heap 中), 而不同于动态属性保存在heap 中。正因为都是在stack中,而stack中指令和数据都是定长的,因此很容易算出偏移量, 也因此不管什么指令(类的方法),都可以访问到类的静态属性。也正因为静态属性被保存在stack中,所以具有了全局属性。 |