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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 蓝枫 中级黑马   /  2014-3-17 10:35  /  1470 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

下面的代码打印结果为什么是:b  c   over  静态代码块优于主函数执行,静态代码块不是只执行一次吗?
还有匿名对象为什么只执行一次?求各位指教!
  1. class Demo
  2. {
  3.   static
  4.         {
  5.            System.out.println("b");   
  6.     }
  7.    public static void main(String[] args)  
  8.           {
  9.         new Demo();   
  10.         new Demo();   
  11.         System.out.println("over");  
  12.       }
  13.    static   
  14.            {
  15.              System.out.println("c");   
  16.            }
  17. }
复制代码

11 个回复

倒序浏览
1.static代码块也叫静态代码块,是在类中独立于类成员的static语句块,可以有多个,位置可以随便放,它不在任何的方法体内,JVM加载类时会执行这些静态的代码块,如果static代码块有多个,JVM将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次。
2.匿名对象由于没有对应的栈内存中引用变量指向,所以只能使用一次,一次之后就将成为垃圾,并且等待被GC回收释放。

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
骑着毛驴去赶 来自手机 中级黑马 2014-3-17 11:01:46
藤椅
静态代码块是随着类的加载而加载,并优先于构造函数,只加载一次,再次调用该类时不再加载,所以第一次执行new Demo()时类第一次加载执行输出b第二次不再执行,然后加载主函数中的静态代码块输出c然后再运行输出over

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
静态代码块 只在类加载的时候运行一次
你这是两个静态代码块啊!!!!!!!

你加个构造代码块就可以看到 匿名对象 都运行了!!!!

  1. class Demo {
  2.         static {
  3.                 System.out.println("b");
  4.         }

  5.         public static void main(String[] args) {
  6.                 new Demo();
  7.                 new Demo();
  8.                 System.out.println("over");
  9.         }

  10.         static {
  11.                 System.out.println("c");
  12.         }
  13.        
  14.         { //构造代码块
  15.                 System.out.println("D");
  16.         }
  17. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
静态代码块,随着类的加载而执行,只执行一次,并优先于主函数。用于给类进行初始化的。所以这里面的两个静态代码块各执行一次,然后读到 System.out.println("over");

匿名对象使用方式一:当对对象的方法只调用一次时,可以用匿名对象来完成,这样写比较简化。
如果对一个对象进行多个成员调用,必须给这个对象起个名字。
匿名对象使用方式二:可以将匿名对象作为实际参数进行传递。

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
osully 发表于 2014-3-17 11:02
静态代码块 只在类加载的时候运行一次
你这是两个静态代码块啊!!!!!!!

为什么加了一个构造代码块,两个匿名对象都运行了呢?还是不太明白!我刚才运行了你的代码,结果出现咯两个D,  能不能再帮我解释一下!麻烦您了!非常感谢!
回复 使用道具 举报
daoyua 中级黑马 2014-3-17 11:36:17
7#
你是2个静态代码块,只是位置在主函数前后,但是都是优先主函数的,只调用一次,2个静态代码块打印完了,才会打印主函数的,和你创建2个对象无关,你构造函数都是空~
回复 使用道具 举报
osully 金牌黑马 2014-3-17 11:39:06
8#
蓝枫 发表于 2014-3-17 11:31
为什么加了一个构造代码块,两个匿名对象都运行了呢?还是不太明白!我刚才运行了你的代码,结果出现咯两 ...

构造代码块 是在构造函数前 对对象进行初始化动作

构造代码块的作用就是对所有对象的共性进行抽取,对所有对象进行初始化.
比如说写一个Person类  我们就可以加入一个构造代码块{ 其中设置国家为中国 }
所以你new一个Person 就执行了构造代码块对这个人 进行初始化 国家为中国 !
回复 使用道具 举报
蓝枫 中级黑马 2014-3-17 11:50:32
9#
osully 发表于 2014-3-17 11:39
构造代码块 是在构造函数前 对对象进行初始化动作

构造代码块的作用就是对所有对象的共性进行抽取,对所 ...

''构造代码块的作用就是对所有对象的共性进行抽取,对所有对象进行初始化''
说的很:清楚,非常感谢,现在明白了!:handshake

点评

加油!  发表于 2014-3-17 12:19
回复 使用道具 举报
静态代码块是对类的初始化,随着类的加载而加载,并且只加载一次,再次调用该类时不再加载。
你的程序执行时,JVM先是加载Demo类,同时加载类中的2个静态代码块,即输出b和c。
而接着2个new Person()操作并没有加载静态代码块,即没有执行静态代码块,最后再输出“over”。

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
静态的代码块会比构造函数更优先的被加载,详细的介绍请看一下这位仁兄的一篇博客,写的很深刻,在此就不在赘述了,这篇博客已经把这个问题讲的很透彻。http://blog.csdn.net/macheng365/article/details/6403050
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马