我来回答,不对的地方请指正。
在我的理解中,这二者是一回事。
子类的非静态成员的初始化在父类的构造方法之后执行。i在子类中是非静态成员,在它初始化(即赋值100)之前,要先执行父类静态变量的初始化、子类静态成员的初始化、父类构造方法等操作,上例中,在父类的构造方法中调用了testAbstract()方法,此方法在父类中被定义为抽象方法,因此实际调用的是子类的tesAbstract()方法,但此时变量i未初始化,所以为0 。
一个类继承了某个抽象类,如果这个类不被定义成抽象类,必须全部实现父类中的抽象方法。
参看2 ,此时初始化已完成,所以i=100.
覆盖和重写可以理解为一个意识。
先初始化父类,后初始化子类,父类初始化的时候,子类没有初始化呢,默认int为0.
抽象类不能实例化,所有的抽象方法在子类中必须实现。
子类初始化完成后,i对应的内存值已经从0改为100了。