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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 彭威 中级黑马   /  2012-4-8 20:01  /  2848 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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啊 ;上边//后那个{}是什么啊,看半天晕了,麻烦都再解释下吗

9 个回复

倒序浏览
静态代码块只要一经类加载就加载了,并且只加载一次,它是专门给类进行初始化用的;
static
          {
                System.out.print(a);

          }
接下来就执行这个区域当中的内容
              {
                System.out.print(c);                                                        
       }
最后再执行符合有一个参数的方法,打印输出d.
所以最终结果就是:a,c,d.
         

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 郑苑东 于 2012-4-8 20:34 编辑

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

{}是构造代码块。虚拟机加载类的顺序:静态代码块-->静态成员-->构造代码块-->构造方法。
静态的只加载一次:静态代码块和静态成员的代码在该类字节码第一次被加载进来时加载进内存,而构造代码块、构造方法在每次new对象时都执行,在堆里开辟一个对象装字段数据。
回复 使用道具 举报
{}是构造代码块,给对象初始化。
虚拟机加载类的顺序:静态代码块-->静态成员-->构造代码块-->构造方法。
回复 使用道具 举报
程旦 来自手机 中级黑马 2012-4-8 23:56:41
7#
静态代码块最先执行,然后是构造代码块,再接着是构造函数,很清楚了吧
回复 使用道具 举报
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:07
class StaticCode
{
          StaticCode()

那个是先打印a的  写错来着。:lol
回复 使用道具 举报
pray 高级黑马 2014-4-26 06:27:19
10#
非常感谢楼主,楼主万岁万岁万万岁!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马