Java中继承问题,以及流程

public class Test{
public static void main(String[] args){
new Child().print();
}
}
class Parent{
protected String str="parent";
protected void print(){
System.out.println(str);
}

public Parent(){
    System.out.println(str);
    print();
    System.out.println(str);
}

}

class Child extends Parent{
protected void print(){
str="child";
System.out.println(str);
}
}
请问这段代码怎样执行的?

先输出一次parent ,输出三次child
先看主函数 定义一个child 对象并调用print()
child 继承自parent ,先调用parent 的构造方法 ,parent 构造方法里面(输出一次str ,调用一次child 的print(重写了) 函数,str(是继承自parent的,由于在child中没有声明这个字符串,也就是没有重写属性) 修改为child并输出 ,后面在输出一次str(这时候是child))
然后再调用child的print方法在输出一次child

其实执行流程是:
加载类时先走构造方法,如果有继承关系,先加载父类。

先看程序入口main方法。 分开看。 new Child(); 先去找子类的无参构造,结果没有。直接就调用父类的无参构造。
输出:parent child child。 接着执行print();方法。输出child. 你自己看下他的执行顺序就明白了