A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 周飞 中级黑马   /  2012-8-11 11:19  /  1434 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 周飞 于 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类究竟是个怎么样的过程,谁可以给个内存分析说明?


4 个回复

倒序浏览
本帖最后由 杨彪 于 2012-8-11 12:00 编辑

静态代码块
        它只执行一次,它比main还先执行  所以打印 a
补充 :假如每次创建对象都执行一次,那么,它和构造代码块就没有区别了。这样同样会造成资源的浪费。所以,java语言在设计的时候,static代码块只能执行一次。
回复 使用道具 举报
这个知道,我们调用一个类不管是不是建立对象还是匿名对象,还是调用静态方法,加载这个类是加载在内存的堆还是栈中,还有这部分内存什么时候释放?
回复 使用道具 举报
本帖最后由 王程 于 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对象,并把这个对象存放在堆内存中。
个人理解,应该是这个样子。
回复 使用道具 举报
看视频知道了,加载类是将.class文件读取到内存代码块中,消失是程序结束吧
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马