黑马程序员技术交流社区

标题: 静态代码块 [打印本页]

作者: 王阳    时间: 2012-10-28 22:34
标题: 静态代码块
本帖最后由 王阳 于 2012-10-28 23:45 编辑

class TestCode{

  static {
    System.out.println("a");
   }
}

class Test{
   public static void main(String [] args){
      new TestCode();
      new TestCode();
}
}

我想问下,为什么main函数里调用两次,只输出一次 a呢? 这种匿名对象的方式不是每次执行一次后,就成垃圾了莫。





作者: 付维翔    时间: 2012-10-28 22:39
因为static静态代码块的内容,在加载对象时在内存中仅存在一份,多次创建对象,只会在第一次创建对象时执行static中的代码
作者: 樊鹏飞    时间: 2012-10-28 22:42
因为你的输出语句在静态代码块里面  而静态代码块是 在类加载时执行的 而且只被加载一次  就算你new 两个对象  它也只打印一次
作者: 陈小红    时间: 2012-10-28 22:51
静态代码块只在加载类时加载到内存中,这个过程在对象创建之前就已完成,与创建对象无关。
作者: 种生祥    时间: 2012-10-28 22:54
静态代码块只随着类的加载而加载,只执行一次,与对象的个数无关,当然,至少得有一个对象,它才会打印
作者: 李连闯    时间: 2012-10-28 22:59
虚拟机在首次加载Java类时,静态初始化块会执行一次,而且仅这一次而已,用来初始化类的静态属性,创建对象调用的是构造方法,与静态代码块的执行不相关的。
作者: 何创    时间: 2012-10-29 00:02
静态代码块的代码,就像前面说的,只在类加载的时候执行,且执行一次。
看看我的代码 经过修改的
public class dd {

         static {
                    System.out.println("a");
                   }


        public static void main(String[] args) {
//                 new dd();
//                         new dd();

        }

}

输出的结果是 a    且只有一次  
可见你的那个输出  和你申明的对象没关系,只是静态代码块中的代码。
作者: 梁枝武    时间: 2012-10-29 01:24
匿名者 发表于 2012-10-29 00:02
静态代码块的代码,就像前面说的,只在类加载的时候执行,且执行一次。
看看我的代码 经过修改的
public cl ...

你的这个一个对象都没产生也会加载dd类吗?
作者: 丁桂松    时间: 2012-10-29 08:02
本帖最后由 丁桂松 于 2012-10-29 08:05 编辑

程序要进入main方法 首先要加载TestCode这个类

从而要执行定义在这个类的静态代码段

输出 a!!

当程序运行到 第一次出现TestCode时 就会加载TestCode这个类从而执行这个类的静态代码段

由于静态代码段只在类第一次加载时才执行 也就是第一个 new TestCode(); 时才执行

后面不论你出现了多少个TestCode都不会再次执行

而且静态代码段

不依赖于类的实例化 只要你的程序执行过程中第一次碰到了TestCode就会马上执行静态代码

不信你把两个new语句去掉 换成

TestCode s = null;

声明一个TestCode 的空引用 程序也会执行静态代码





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2