黑马程序员技术交流社区

标题: 继承和代码块 [打印本页]

作者: wangjie    时间: 2015-10-7 12:35
标题: 继承和代码块

情况一:当一个类继承于另一个类时。   规则:成员变量,构造代码块,构造方法。这三者中,无论顺序怎样,构造方法都是最后执行的。而成员变量,构造代码块是顺序执行,谁在前谁先执行。
      1、先加载父类(有静态代码块就执行),后加载子类(有静态代码块就执行)。--->(先执行静态代码块)
      2、接着执行main方法中的代码(假设是创建该子类对象),创建该子类对象时,会先执行父类中空参构造方法,(根据以上规则,如果有成员变量 和构造代码块就先于构造方法执行),再执行子类构造方法。(根据以上规则,如果有成员变量和构造代码块就先于构造方法执行)。
情况二:当一个类没有继承于另一个类时。       1、直接先加载子类(有静态代码块就执行)。--->(先执行静态代码块)
      2、接着执行main方法中的代码(假设是创建该类对象),创建该类对象时,会执行该类对应的构造方法。(根据以上规则,如果有成员变量和构造代码块就先于构造方法执行)。




每进入到一个类中时就按情况一或者情况二分析。欢迎大家批评指正!

以下数字(1,2,3.........)代表输出顺序。
class W {
        {System.out.println("W构造代码块----10"); }
        static{System.out.println("W静态代码块----9");}
        W() {
                System.out.println("W构造方法---11");   
        }
}
class Y {
        {System.out.println("Y构造代码块----5"); }
        static{System.out.println("Y静态代码块------4");}
        Y() {
                System.out.println("Y构造方法....6");  
        }
}
class X {
        {System.out.println("X构造代码块---------3"); }
        static{System.out.println("X静态代码块------1");}
        Y b = new Y();
        X() {
                System.out.println("X构造方法....-----7");  
        }
}
public class Z extends X {
        {System.out.println("Z构造代码块---8"); }
        
        W w = new W();
        Z() {
                super();
                System.out.println("Z构造方法....12");   
        }
        static{System.out.println("Z静态代码块-------2");}
        public static void main(String[] args) {
                //{System.out.println("Z局部代码块"); }
                new Z();
        }
}




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