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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王阳 中级黑马   /  2012-10-28 22:34  /  1693 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 王阳 于 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呢? 这种匿名对象的方式不是每次执行一次后,就成垃圾了莫。




评分

参与人数 1技术分 +1 收起 理由
谭立文 + 1 新人鼓励,好好看,毕老师的java基础.

查看全部评分

8 个回复

倒序浏览
因为static静态代码块的内容,在加载对象时在内存中仅存在一份,多次创建对象,只会在第一次创建对象时执行static中的代码

评分

参与人数 1技术分 +1 收起 理由
谭立文 + 1

查看全部评分

回复 使用道具 举报
因为你的输出语句在静态代码块里面  而静态代码块是 在类加载时执行的 而且只被加载一次  就算你new 两个对象  它也只打印一次

评分

参与人数 1技术分 +1 收起 理由
谭立文 + 1

查看全部评分

回复 使用道具 举报
静态代码块只在加载类时加载到内存中,这个过程在对象创建之前就已完成,与创建对象无关。

评分

参与人数 1技术分 +1 收起 理由
谭立文 + 1

查看全部评分

回复 使用道具 举报
静态代码块只随着类的加载而加载,只执行一次,与对象的个数无关,当然,至少得有一个对象,它才会打印

评分

参与人数 1技术分 +1 收起 理由
谭立文 + 1

查看全部评分

回复 使用道具 举报
虚拟机在首次加载Java类时,静态初始化块会执行一次,而且仅这一次而已,用来初始化类的静态属性,创建对象调用的是构造方法,与静态代码块的执行不相关的。

评分

参与人数 1技术分 +1 收起 理由
谭立文 + 1

查看全部评分

回复 使用道具 举报
何创 中级黑马 2012-10-29 00:02:17
7#
静态代码块的代码,就像前面说的,只在类加载的时候执行,且执行一次。
看看我的代码 经过修改的
public class dd {

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


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

        }

}

输出的结果是 a    且只有一次  
可见你的那个输出  和你申明的对象没关系,只是静态代码块中的代码。

评分

参与人数 1技术分 +1 收起 理由
谭立文 + 1

查看全部评分

回复 使用道具 举报
梁枝武 来自手机 高级黑马 2012-10-29 01:24:40
8#
匿名者 发表于 2012-10-29 00:02
静态代码块的代码,就像前面说的,只在类加载的时候执行,且执行一次。
看看我的代码 经过修改的
public cl ...

你的这个一个对象都没产生也会加载dd类吗?
回复 使用道具 举报
本帖最后由 丁桂松 于 2012-10-29 08:05 编辑

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

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

输出 a!!

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

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

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

而且静态代码段

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

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

TestCode s = null;

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

评分

参与人数 1技术分 +1 收起 理由
谭立文 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马