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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 老司机喔 中级黑马   /  2016-5-2 17:55  /  549 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

看程序写结果
class Demo2 {
               public static void main(String[] args) {
                       Man m=new Man();
             }
}
class person {
               static {
                System.out.println("a");
                 }

{
              System.out.println("b");
}

public person() {
              System.out.println("c");
          }
}

class Man extends person {
      static {
          System.out.println("d");
   }

   {
        System.out.println("e");
    }

public Man() {
       System.out.println("f");
   }
}

为什么运行的结果是a-d-b-c-e-f

4 个回复

倒序浏览
优先级的原因吧
回复 使用道具 举报
只要虚拟机已加载类,静态代码块就会执行,且静态代码块是优先于主方法执行的,
回复 使用道具 举报
只要虚拟机已加载类,静态代码块就会执行,且静态代码块是优先于主方法执行的,普通代码块和一般的语句执行顺序由他们在代码中出现的次序决定--“先出现先执行”
回复 使用道具 举报
从main函数为代码的入口,是创建了一个Man的对象,所以去找Man类,但是Man类是继承person类,所以在子类的静态代码块中,系统都会默认的super()父类中的静态代码块,所以先是输出a,然后输出d.
然后再看构造代码块,可以把构造代码块中的代码复制到构造方法中,又因为子类中系统默认有个super(),所以第三,四个输出的是b,c,第五,六个是e,f
其实只要记住那三句话,就妥妥的了.
1.静态优先于非静态
2.父类优先于子类
3.构造代码块优先于构造方法
谢谢.....
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马