- public class ExA {
- //private static ExA a = new ExA();
- static {
- System.out.println("父类--静态代码块A"); //1.java虚拟机加载ExA.class文,静态代码块执行
- }
-
- public ExA() {
- System.out.println("父类--构造函数B"); //7 父类的构造方法中的代码被执行
- }
-
- {
- System.out.println("父类--非静态代码块C"); /*6 父类中的构造代码块被执行,(网上说:在编
- 译时期编译器会默认将构造代码块中的代码移动到构造方法中,而且移动到构造方法的前面,所以他
- 优先于构造方法中的代码先执行)*/
- }
-
- public static void main(String[] args) {
- System.out.println("主函数打印语句S");//2.找到主函数,执行打印语句。
- new ExB();//3. 创建子类匿名对象
- }
- }
-
- class ExB extends ExA {
- // private static ExB b = new ExB();
- static {
- System.out.println("子类--静态代码块D"); //4.主函数中创建子类匿名对象后,加载ExB.class文件 子类静态代码块执行
- }
- {
- System.out.println("子类--非静态代码块E"); //8 子类的构造代码块被执行
- }
-
- public ExB() {
- //super() 5.执行父类的构造方法
- System.out.println("子类--构造函数F"); //9 子类构造方法中的代码被执行
- }
- }
复制代码
上面执行顺序的前提是private static ExA a = new ExA(); private static ExB b = new ExB(); 都被注释掉了,求去掉注释后此段代码的执行顺序变化的原因。 |
|