关于java成员方法继承内存图我们还是结合具体代码进行分析:
还是老样子,首先测试类的main()方法和class文件加载到方法区,main()方法被虚拟机调用入栈,执行main方法中第一句代码,将类Zi的字节码文件和成员变量以及方法加载到方法区,有类Zi继承了Fu类,所有Zi类会把Fu类的class文件和成员变量以及方法加载至方法区,同时Fu类继承object类,所以object的class文件也会被加。然后虚方法表中会加载object类中的5个虚方法,接着类Fu继承object的虚方法,同时在将自己的1个虚方法加载如虚方法表中,此时虚方法表中有7个虚方法。
接着执行等号左边,Zi z加载入栈,等号右边在堆内存中开辟一个空间,与之前不同的是,该空间被一分为二,一边加载父类的成员变量,一边则是自己的成员变量,由于父类中和本类中均无变量,所有两侧内存里面为空。对于生成的变量各自赋上初始化值。并将地址赋值给栈中的变量。
接下来,sout(z)则输出的是地址值001,代码继续执行,z.zishow()和fu.show1(),直接在虚方法表中查找该方法,若存在则直接调用,将方法加载到栈中。接着同样方法执行zi.fushow2(),虚方法表没有该方法,则依次查找本类和所有父类的所有成员方法,在fu类中查到该方法,发现是私有成员方法,因此不能调用,系统报错。
什么是虚方法
如下下图