黑马程序员技术交流社区

标题: 静态代码块问题——疑惑 [打印本页]

作者: 静心明德    时间: 2015-4-15 21:41
标题: 静态代码块问题——疑惑
请大神们帮我分析分析, 下面是我看视频写的一段代码,可是这段程序第一次的执行结果和我预料的一样,是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. }
复制代码





作者: IT杰    时间: 2015-4-15 21:46
:),有些难度,不会
作者: 米家小九    时间: 2015-4-15 22:22
兄弟你的代码写错啦,你看看你的构造代码块是怎样输出的,你用的是err而不是out
作者: ln_gu    时间: 2015-4-15 22:50
顶楼上顶楼上顶楼上顶楼上!
作者: 火七君    时间: 2015-4-15 23:10
如果我跟你说这个可能是打印到控制台的时候有点延迟你信吗?
我给你改了改结果就没变过了,说明顺序是固定的
  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 23:12
米家小九 发表于 2015-4-15 22:22
兄弟你的代码写错啦,你看看你的构造代码块是怎样输出的,你用的是err而不是out ...

err也可以。有点小差别而已,能打印
作者: 小龟    时间: 2015-4-15 23:32
为什么延迟了一下就不会变了?
作者: 静心明德    时间: 2015-4-15 23:57
米家小九 发表于 2015-4-15 22:22
兄弟你的代码写错啦,你看看你的构造代码块是怎样输出的,你用的是err而不是out ...

哈哈,心细,佩服,谢谢了,这教训记下了。:handshake
作者: 静心明德    时间: 2015-4-16 00:00
小龟 发表于 2015-4-15 23:32
为什么延迟了一下就不会变了?

正解见一楼




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