黑马程序员技术交流社区

标题: 已解决—关于静态代码块和内存分析 [打印本页]

作者: 周飞    时间: 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