今天,复习的是继承的内存分配。咱们知道,Java中内存能够初略分为堆、栈、方法区。java
父类
学生null0
子类
学生tom20函数
能够先画个内存图:post
能够简易理解成父类的空间是一个小圆,被子类的大圆包住了,因此当咱们从子类找一个变量,是先从大圈圈找,找到了就返回,若是大圈圈没有,那就到小圈圈里找。spa
这个程序执行的基本流程是:.net
1.虚拟机加载Test类,提取类信息到方法区;线程
2.经过保存在方法去的字节码,虚拟机开始执行main方法,main函数入栈;对象
3.执行Student s = new Student();给student实例对象分配堆空间。又由于实现本身要先实现父类,因此,虚拟机加载person类到方法区,并在堆中为父类成员变量在子类空间中初始化。而后加载student类到方法区,为子类的成员变量分配空间并初始化。blog
4.接下来两条语句为成员变量赋值,因为name跟age是从父类继承而来,会被保存在子类父对象中,因此就根据引用变量s持有的引用找到堆中的对象(子类对象),而后给name跟age赋值。继承
5.调用say()方法,经过引用变量s持有的引用找到堆中的实例对象,经过实例对象持有的本类在方法区的引用,找到本类的类型信息,定位到say()方法。say()方法入栈。开始执行say()方法中的字节码。ip
6.say()方法执行完毕,say方法出栈,程序回到main方法,main方法执行完毕出栈,主线程消亡,虚拟机实例消亡,程序结束。
总结:相同的方法会被重写,变量没有重写之说,若是子类声明了跟父类同样的变量,那意味着子类将有两个相同名称的变量。一个存放在子类实例对象中,一个存放在父类子对象中。父类的private变量,也会被继承而且初始化在子类父对象中,只不过对外不可见。
当出现多态状况的时候,调的具体是哪一个函数又须要匹配了。