黑马程序员技术交流社区

标题: 视频中的:静态代码块那些事!! [打印本页]

作者: 彭威    时间: 2012-4-8 20:01
标题: 视频中的:静态代码块那些事!!
class StaticCode
{
          StaticCode()
          {
                 System.out.print(b);
          }
          static
          {
                System.out.print(a);

          }
          {
                System.out.print(c);                                                 //{}是什么意思啊
          }
          StaticCode(int x)
          {
                 System.out.print(d);
          }

}
class D
{
         public static void main(String[] args)
        {
              new StaticCode(4);
         }
}                                                                                              //acd ??? 晕了


问下:结果怎么成了acd啊 ;上边//后那个{}是什么啊,看半天晕了,麻烦都再解释下吗
作者: 马超    时间: 2012-4-8 20:08
静态代码块只要一经类加载就加载了,并且只加载一次,它是专门给类进行初始化用的;
static
          {
                System.out.print(a);

          }
接下来就执行这个区域当中的内容
              {
                System.out.print(c);                                                        
       }
最后再执行符合有一个参数的方法,打印输出d.
所以最终结果就是:a,c,d.
         
作者: 郑苑东    时间: 2012-4-8 20:20
本帖最后由 郑苑东 于 2012-4-8 20:34 编辑

{。。。。。}这里是代码块。。如果前面有static修饰就是静态代码块。。。
当虚拟机运行时,,一开始是加载类。。加载完了之后是会静态的成员变量进行初始化赋值这里的赋值是系统的默认值。。即使我们后面写上 static String name="张三"。。。这时候的初始化也是name=null。。然后根据顺序执行静态内容。。静态内容包括静态成员变量和静态代码块。。执行时是根据顺序执行下来的。。如果你一开始有些static String name="张三"。。。这时候才是真正的让name="张三";然后就是成员变量的初始化。。然后就是普通代码块和成员变量的参数。。。同样是根据顺序执行下来的。。。最后才是构造函数。。希望这样够清晰了吧。。。
作者: 曾晓文    时间: 2012-4-8 20:25
{}是构造代码块。虚拟机加载类的顺序:静态代码块-->静态成员-->构造代码块-->构造方法。

作者: 曾晓文    时间: 2012-4-8 20:32
本帖最后由 曾晓文 于 2012-4-8 20:34 编辑

{}是构造代码块。虚拟机加载类的顺序:静态代码块-->静态成员-->构造代码块-->构造方法。
静态的只加载一次:静态代码块和静态成员的代码在该类字节码第一次被加载进来时加载进内存,而构造代码块、构造方法在每次new对象时都执行,在堆里开辟一个对象装字段数据。
作者: 刘保峰    时间: 2012-4-8 20:46
{}是构造代码块,给对象初始化。
虚拟机加载类的顺序:静态代码块-->静态成员-->构造代码块-->构造方法。

作者: 程旦    时间: 2012-4-8 23:56
静态代码块最先执行,然后是构造代码块,再接着是构造函数,很清楚了吧
作者: 邱俊杰    时间: 2012-4-9 10:07
class StaticCode
{
          StaticCode()
          {
                 System.out.print(b); //这段代码没带参数。接收不到传入的值。所以不打印出来
          }
          static
          {
                System.out.print(a);               //{}静态代码块随着类的执行就执行了,优先于其他方法所以先打印C

          }
          {
                System.out.print(c);         ///然后顺序执行下去, cd就出来了                                       
          }
          StaticCode(int x)
          {
                 System.out.print(d);
          }

}
class D
{
         public static void main(String[] args)
        {
              new StaticCode(4);
         }
}
作者: 邱俊杰    时间: 2012-4-9 10:08
邱俊杰 发表于 2012-4-9 10:07
class StaticCode
{
          StaticCode()

那个是先打印a的  写错来着。:lol
作者: pray    时间: 2014-4-26 06:27
非常感谢楼主,楼主万岁万岁万万岁!




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