首先需要明白几个关键点,子类,父类的执行顺序,成员变量开辟空间和赋值时机。第一执行的肯定是 为变量和方法开辟内存空间,第二按照继承顺序 逐步往下执行,在执行构造方法之前 先为 类所在层次的 变量赋值;第三 执行构造方法,如果构造方法体里面,包含被子类 重载的方法,那么执行的是 子类的所覆盖的方法。我是按照断点调试的方法得出的,在i ,j 变量,父类的print()分别设定断点,你也可以用这种方法试试。
根据题目的执行顺序如下:
1、为子类变量 j 和父类 i 开辟内存空间
2、执行 父类Super的 构造方法
2.1 执行print() ,由于Super的 print() 被重载,所以执行的是 Sub 类中 的 print() ,由于此时 J 只开辟了空间,尚未赋值,所以为 0,因而第一被打印出来的是 0 ;
3、执行 Sub 类的构造方法 ,在 执行 Sub 类 的构造方法之前就已经 为 j 变量赋值了。接下来的程序,自然不用我说了;
|