黑马程序员技术交流社区
标题:
已解决—关于静态代码块和内存分析
[打印本页]
作者:
周飞
时间:
2012-8-11 11:19
标题:
已解决—关于静态代码块和内存分析
本帖最后由 周飞 于 2012-8-11 12:45 编辑
class StaticCode {
static {
System.out.println("a");
}
}
class TestStatic {
public static void main(String[] args) {
new StaticCode();
new StaticCode();
}
}
运行结果:a
第二个new StaticCode();没有执行,内存中已经加载了StaticCode类。
匿名对象是用完就消失,那加载StaticCode类究竟是个怎么样的过程,谁可以给个内存分析说明?
作者:
杨彪
时间:
2012-8-11 11:24
本帖最后由 杨彪 于 2012-8-11 12:00 编辑
静态代码块
它只执行一次,它比main还先执行 所以打印 a
补充 :假如每次创建对象都执行一次,那么,它和构造代码块就没有区别了。这样同样会造成资源的浪费。所以,java语言在设计的时候,static代码块只能执行一次。
作者:
周飞
时间:
2012-8-11 11:27
这个知道,我们调用一个类不管是不是建立对象还是匿名对象,还是调用静态方法,加载这个类是加载在内存的堆还是栈中,还有这部分内存什么时候释放?
作者:
王程
时间:
2012-8-11 12:46
本帖最后由 王程 于 2012-8-11 12:49 编辑
class StaticCode {
static {
System.out.println("a");
}
}
class TestStatic {
public static void main(String[] args) {
new StaticCode();
new StaticCode();
}
}
当执行程序的入口main方法开始后, 执行new StaticCode(),JVM先要查看StaticCode这个类是不是已经加载到内存中,如果还没有加载到内存中,则要去查找到这个类,并把它加载到内存中,如果已经加载到内存中,则直接调用这个类。加载StaticCode这个类时,因为有静态代码块,所以会把静态代码块的内容在方法区中,并执行一次其中的代码。然后才new一个StaticCode对象,并把这个对象存放在堆内存中。
个人理解,应该是这个样子。
作者:
周飞
时间:
2012-8-11 12:56
看视频知道了,加载类是将.class文件读取到内存代码块中,消失是程序结束吧
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2