实际上还是父类分配父类的内存空间,子类分配子类的内存空间。[子类只分配自己特有的成员的内存,其他的使用父类的,你要记注子类中有一个父类的指针,也就是引用Super,子类是通过super来找到自己的父类的。],最终合并到了一起,这里只是这么理解。
通过this.age和base.age使用同一个内存地址也可以看出,这种理论也可以解释为什么构造函数不能被继承,只能子类来调用父类的构造函数。
因为父类构造函数是要用来为父类分配内存空间,子类“调用”而非“继承”父类构造函数。然后在调用自己的构造函数。
如果子类重写父类的方法时,通过虚方法表来寻找子类的实现。在实例化子类对象时,是先构造父类的内存块,然后再构造子类的(子类相对于父类扩展了的那些)。
编译器的调用过程是先调用基类的构造函数,对派生类中的基类数据进行初始化,然后再调用派生类自己的构造函数,对派生类的数据进行初始化工作。
子类里有一个区域放的父类的实例,子类内存区里有一个this指针,指向了这个内存区里包括的父类实例区,
当把引用付给父类时,是把子类内存区里面的父类实例区域的引用给了父类的实例.
|