最近在复习JAVA的内存知识。静态变量是加载在方法区的,内存分配即在方法区,当创建类的时候堆里有静态变量的指向地址,然后栈内的对象可以通过堆内地址找到该静态变量,为大家共用。
那静态方法呢?也是在方法区中分配内存吗?是随着类的加载而初始化的吗?但是我测试的如下运行代码,却并没有运行此静态方法。
package com.learn.java.cc;
class Static1{
static void sys1(){
System.out.println("hello!");
}
}
public class StaticDemo {
public static void main(String[] args){
Static1 s = new Static1();
}
}
求解?
原因:感谢各位的回答,在类中还有一个叫做静态代码块和构造代码块(即没有静态修饰的只被{}的代码),创建对象的时候会默认先加载静态代码块和构造代码块,这里的print会被打印出来,然后加载构造方法,而本类中的静态方法只是在调用的时候才被使用。
package com.learn.java.cc;
class Static1{
{
System.out.println("hello2!");
}
static{
System.out.println("hello1!");
}
static void sys1(){
System.out.println("hello3!");
}
}
public class StaticDemo {
public static void main(String[] args){
Static1 s = new Static1();
}
}
结果:
hello1!
hello2!
参考一下这个
从JVM内存管理的角度谈谈JAVA类的静态方法和静态属性
http://wenku.baidu.com/link?url=6R8APlDo96HPW4gDK5hv7hTDn4Q6lA6atMc2GKx93yGRaYws6lN__9N_hipLsNmWc9DLPt9eFGenHEnNdZXU7TcJRkouHF9D_t76Hsw72nu
java的方法,都被编译成字节码了,作为类的类型信息保存在.class文件中。
静态方法不需要初始化,方法的本质就是一系列的字节码(也就是执行指令),只有类才需要初始化,方法不会被初始化的。
建议看看深入浅出JVM,了解下字节码的组成,以及java代码的执行流程。
静态方法和普通方法是一样的,只有调用的时候才会使用,方法不存在什么初始化的。
调用方法的时候,静态方法和普通方法生成的字节指令是不一样的,所以这样就可以辨别出你调用的是静态方法还是普通方法
所以最终的答案是?
解释地没明白呀。。
静态方法属于类所有,类放在堆里