黑马程序员技术交流社区

标题: 静态代码执行顺序问题 [打印本页]

作者: chuanyueing    时间: 2013-2-21 12:17
标题: 静态代码执行顺序问题
本帖最后由 朱玺 于 2013-2-21 12:22 编辑

这里有几个疑问,1:{System.out.println("c"+this.num)},在程序里可以直接括号里面写程序?这个叫什么结构?
                            2:为什么执行顺序是先a之后是c,而我认为是先a在d,关键是搞不懂问题1是什么结构,哪位大侠给详细解释下,谢谢了![qq]630634604[/qq]
  1. class StaticCode
  2. {
  3.      int num = 9;
  4.      StaticCode()
  5.      {
  6.           System.out.println("b");
  7.      }

  8.      static
  9.      {
  10.           System.out.println("a");
  11.      }

  12.      {
  13.           System.out.println("c"+this.num);
  14.      }

  15.      StaticCode(int x)
  16.      {
  17.           System.out.println("d");
  18.      }

  19.      public static void show()
  20.      {
  21.           System.out.println("show run");
  22.      }
  23. }

  24. class StaticCodeDemo
  25. {
  26.      public static void main(String[] args)
  27.      {
  28.           new StaticCode(4);//a c d
  29.      }
复制代码

作者: 黑马刘杰    时间: 2013-2-21 12:30
问题一是动态代码块啊,动态代码块在类加载的时候就会执行,不过是在静态代码块后面。
代码块只在类加载时时执行,也就是只执行一次,大都用于初始化数据。
作者: 黑马李超    时间: 2013-2-21 12:36
对象初始化的过程是先执行static代码块,然后是进行默认初始化,接着是对属性进行显示初始化,最后是构造函数初始化。
System.out.println("c"+this.num);是显示初始化 ,所以在构造函数初始化之前。

作者: 罗理    时间: 2013-2-21 13:16
程序初始化时先执行静态代码块static{},在执行非静态代码块{},然后执行构造函数  StaticCode(int x)。如果有继承关系的话,先在父类中找有没有静态代码块,有就执行,再在子类中找静态代码块执行;接着先在父类中先看有没有非静态代码块可以执行,然后执行父类的构造函数;再到子类中执行子类的非静态代码块,然后是子类的构造函数。
{System.out.println("c"+this.num)}-----非静态代码块




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