new B();//执行过程如下:
new,JVM为B类的对象分配内存
调用B的构造方法,执行初始化。
B的构造方法自动调用父类的无参构造方法(编译器会在子类的构造方法的第一行插入父类的无参构造方法)
父类A的构造方法中调用了方法setI(20);//此处是关键,new B();不会创建父类对象,调用父类构造方法只是用来执行父类中的初始化代码,不是创建对象,创建对象是new关键字,构造方法只是初始化,这里可能很难理解,不过这是JVM执行的方式,也是new关键字的作用。
所以,父类A构造方法中调用的是子类的setI,不是父类的setI。整个过程中只有一个对象——B类的对象
类继承是不分时间段的,只分限定符(private protected, public)
创建B的时候,并不是要先创建A,而是先依据定义和继承创建对象,再依次执行初始化方法
在B创建实例的时候,父类初始化方法中调用的方法(如:setI)会优先从B上找定义
所以,B创建的时候,i是默认值 7,然后执行父类A的初始化方法,这时候方法是执行在B上的,并不是创建一个A的实例