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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 静心明德 中级黑马   /  2015-4-15 21:41  /  707 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

请大神们帮我分析分析, 下面是我看视频写的一段代码,可是这段程序第一次的执行结果和我预料的一样,是b,c,d;
可是当执行很多次的时候,就会出现输出c,b,d;自己搞不清楚是什么原因,请明白其中道理的大神告诉小弟,不甚感激。:handshake:handshake
源代码如下:
  1. class StaticCode{
  2.         StaticCode(){
  3.                 System.out.println("a");
  4.         }
  5.         //静态代码块是用于给类初始化的
  6.         static{
  7.                 System.out.println("b");
  8.         }
  9.         //构造代码块是用于给对象初始化的
  10.         {
  11.                 System.err.println("c");
  12.         }
  13.        
  14.         public static void show(){
  15.                 System.out.println("run over");
  16.         }
  17.        
  18.         StaticCode(int x){
  19.                 System.out.println("d");
  20.         }       
  21. }

  22. public class StaticCodeTest {

  23.         /**
  24.          * @param args
  25.          */
  26.         public static void main(String[] args) {
  27.                 // TODO Auto-generated method stub
  28.                 new StaticCode(5);
  29.         }
  30. }
复制代码




8 个回复

倒序浏览
:),有些难度,不会
回复 使用道具 举报
兄弟你的代码写错啦,你看看你的构造代码块是怎样输出的,你用的是err而不是out
回复 使用道具 举报 1 0
顶楼上顶楼上顶楼上顶楼上!
回复 使用道具 举报
如果我跟你说这个可能是打印到控制台的时候有点延迟你信吗?
我给你改了改结果就没变过了,说明顺序是固定的
  1. class StaticCode{
  2.     StaticCode(){
  3.             System.out.println("a");
  4.     }
  5.     //静态代码块是用于给类初始化的
  6.     static{
  7.             try {
  8.                         Thread.sleep(100);
  9.                 } catch (InterruptedException e) {
  10.                        
  11.                         e.printStackTrace();
  12.                 }
  13.             System.out.println("b");
  14.     }
  15.     //构造代码块是用于给对象初始化的
  16.     {
  17.             try {
  18.                         Thread.sleep(100);
  19.                 } catch (InterruptedException e) {
  20.                        
  21.                         e.printStackTrace();
  22.                 }
  23.             System.err.println("c");
  24.     }
  25.    
  26.     public static void show(){
  27.             System.out.println("run over");
  28.     }
  29.    
  30.     StaticCode(int x){
  31.             try {
  32.                         Thread.sleep(100);
  33.                 } catch (InterruptedException e) {
  34.                        
  35.                         e.printStackTrace();
  36.                 }
  37.             System.out.println("d");
  38.     }        
  39. }

  40. public class StaticCodeTest {

  41.     /**
  42.      * @param args
  43.      */
  44.     public static void main(String[] args) {
  45.             // TODO Auto-generated method stub
  46.             new StaticCode(5);
  47.     }
  48. }
复制代码
回复 使用道具 举报
米家小九 发表于 2015-4-15 22:22
兄弟你的代码写错啦,你看看你的构造代码块是怎样输出的,你用的是err而不是out ...

err也可以。有点小差别而已,能打印
回复 使用道具 举报
小龟 中级黑马 2015-4-15 23:32:58
7#
为什么延迟了一下就不会变了?
回复 使用道具 举报
米家小九 发表于 2015-4-15 22:22
兄弟你的代码写错啦,你看看你的构造代码块是怎样输出的,你用的是err而不是out ...

哈哈,心细,佩服,谢谢了,这教训记下了。:handshake
回复 使用道具 举报
小龟 发表于 2015-4-15 23:32
为什么延迟了一下就不会变了?

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