关于多态(动态绑定)见下面具体分析:
首先说明以下知识点:
动态绑定(多态):在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。
父类引用指向子类对象,但是父类引用所能看到的只属于父类那部分属性和方法。此过程还存在指针指向变化情况(因为重写),从指向原来自己方法变化到指向new出来对象的方法。
以简单程序举例:
classA{intm;publicintgetM{returnm;}publicvoidsetM(intm){this.m=m;}classBextendsA{intm;publicintgetM{returnm+100;}}publicclassE{publicstaticvoidmain(String[]args){Bb=newB;b.m=20;System.out.println(b.getM);// 120Aa=b;a.m=-100;System.out.println(a.getM);// -100}}
下面针对此题画内存分析图分析并附加代码解释:
小编是一个有着5年工作经验的java程序员,对于java,自己有做资料的整合,一个完整学习java的路线,学习资料和工具,相信这里有很多学习java的小伙伴,我创立了一个2000人学习扣群,479121291。每晚都有java的直播课程。无论是初级还是进阶的小伙伴小编我都欢迎!
b.m = 20; 修改的是B类的属性,如图。
b.getM; 是取到B对象自己的方法,输出20+100
A a = b; 此时a指向B对象,但是所能看到的只是父类那部分属性和方法。此过程还发生上 面知识点2中的指针指向变化,如图绿色变变化指向。
a.m = -100; 因为只能看到父类那部分属性和方法,所以修改的是A对象的属性,如图
a.getM; 因为此时指向方法的指针发生给变,所以指向的还是B对象的方法(自然用B的属性),输出还是20+100