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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 左耳的鱼 中级黑马   /  2013-6-27 22:59  /  991 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 左耳的鱼 于 2013-6-28 10:08 编辑

        class Demo3 {
                static{
                        System.out.println("静态代码块");
                }
        public static void main(String[] args) {
                {
                        System.out.println("局部代码块");
                }

                Test t = new Test();
        }
}

class Test{
        
        {
                System.out.println("第一个初始块" + this.x);
        }

        
        
        Test() {
                System.out.println("x =" + x);
        }

        {
                System.out.println("第二个初始块" + this.x);
        }

        int x = 7;
        
        
}
为什么执行结果x=7,x被赋值7不是在构造方法之后吗?执行顺序是怎样的?

评分

参与人数 1技术分 +1 黑马币 +5 收起 理由
神之梦 + 1 + 5 神马都是浮云

查看全部评分

3 个回复

倒序浏览
  1. class Demo3 {
  2.                 static{
  3.                         System.out.println("静态代码块");//第一步
  4.                 }
  5.         public static void main(String[] args) {
  6.                 {
  7.                         System.out.println("局部代码块");//第二步
  8.                 }

  9.                 Test t = new Test();
  10.         }
  11. }

  12. class Test{
  13.         
  14.         {
  15.                 System.out.println("第一个初始块" + this.x);//第三步
  16.         }

  17.         
  18.         
  19.         Test() {
  20.                 System.out.println("x =" + x);//第六步
  21.         }

  22.         {
  23.                 System.out.println("第二个初始块" + this.x);//第四步
  24.         }

  25.         int x = 7;//第五步
  26.         
  27.         
  28. }
复制代码
最先执行的是静态代码块,因为静态代码块随着程序的加载而加载,第二步顺序执行局部代码块,然后调用了Test类的构造方法,而Test类中有构造代码块,构造代码块在构造方法前执行,需要注意的是Test类中的x是成员变量不是局部变量,初始化值为0,需要注意的是显示初始化和构造代码块的执行也是有顺序的,如果int x=7,在构造代码块的上面,就先进行显示初始化再执行构造代码块,
  1. class Demo3 {
  2.                 static{
  3.                         System.out.println("静态代码块");//第一步
  4.                 }
  5.         public static void main(String[] args) {
  6.                 {
  7.                         System.out.println("局部代码块");//第二步
  8.                 }

  9.                 Test t = new Test();
  10.         }
  11. }

  12. class Test{
  13.                 int x = 7;//第三步
  14.         {
  15.                 System.out.println("第一个初始块" + this.x);//第四步
  16.         }

  17.         
  18.         
  19.         Test() {
  20.                 System.out.println("x =" + x);//第六步
  21.         }

  22.         {
  23.                 System.out.println("第二个初始块" + this.x);//第五步
  24.         }

  25.         
  26.         
  27.         
  28. }
复制代码
结果是

  1. 静态代码块
  2. 局部代码块
  3. 第一个初始块7
  4. 第二个初始块7
  5. x =7
复制代码
而此题中int x=7,在构造代码块的下面,所以要先执行构造代码块,再进行显示初始化,然后执行构造函数。
对于问题“为什么执行结果x=7,x被赋值7不是在构造方法之后吗?”,x是成员变量,成员变量赋初值都是在构造方法之前执行的

评分

参与人数 1技术分 +1 黑马币 +2 收起 理由
神之梦 + 1 + 2 很给力!

查看全部评分

回复 使用道具 举报
静态代码块随着类的加载而加载,执行1:静态代码快执行2:局部代码块然后new个对象,加载test,此时静态代码块的x默认是0,执行3:第一个厨师块。x=0.完了后就是构造代码块的加载,就是test().下面大括号内容执行4:第二个初始块x=0.最后成员x=7test()打印出x=7执行5:x=7

评分

参与人数 1技术分 +1 黑马币 +2 收起 理由
神之梦 + 1 + 2 像楼上那样有代码分析更好

查看全部评分

回复 使用道具 举报
x=7,是成员变量。进入test()中,在这里,成员x的值就赋给了打印中的x。明白吗,你的是个空参数的构造函数。x=7这个是直接赋值的。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马