黑马程序员技术交流社区

标题: 新手求大神解答 [打印本页]

作者: 老司机喔    时间: 2016-5-2 17:55
标题: 新手求大神解答
看程序写结果
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

作者: lvaenet1    时间: 2016-5-2 18:08
优先级的原因吧
作者: feixiang666    时间: 2016-5-2 18:12
只要虚拟机已加载类,静态代码块就会执行,且静态代码块是优先于主方法执行的,
作者: feixiang666    时间: 2016-5-2 18:22
只要虚拟机已加载类,静态代码块就会执行,且静态代码块是优先于主方法执行的,普通代码块和一般的语句执行顺序由他们在代码中出现的次序决定--“先出现先执行”
作者: 单曲循环1992    时间: 2016-5-2 18:22
从main函数为代码的入口,是创建了一个Man的对象,所以去找Man类,但是Man类是继承person类,所以在子类的静态代码块中,系统都会默认的super()父类中的静态代码块,所以先是输出a,然后输出d.
然后再看构造代码块,可以把构造代码块中的代码复制到构造方法中,又因为子类中系统默认有个super(),所以第三,四个输出的是b,c,第五,六个是e,f
其实只要记住那三句话,就妥妥的了.
1.静态优先于非静态
2.父类优先于子类
3.构造代码块优先于构造方法
谢谢.....




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