现在的位置: 首页 > 综合 > 正文

图解Java多态内存分配解析

2013年06月12日 ⁄ 综合 ⁄ 共 724字 ⁄ 字号 评论关闭
Person worker = new Worker();

子类实例对象地址赋值给父类类型引用变量。多态的体现。

worker.startWork(); 为什么调用不到呢?

因为引用变量worker是父类类型,他会去子类父对象中拿Person类的引用,然后在方法区找到本类的类型信息,定位不到startWork()方法。所以,提示找不到符号。【红色箭头轨迹】

向上转型,就这么回事。

------------------------------

Worker w = (Worker)worker;

这么一搞为什么就能调的到了呢?

引用变量worker持有的本来就是子类对象的引用。

然后,我把引用赋值给一个子类类型引用变量,然后调用startWork()方法,他就会根据引用找到实例对象,然后实例对象通过持有的引用,找到本类在方法区的类型信息,定位到startWork()方法。ok,定位到了。方法入栈,走你~【绿色箭头轨迹】

向下转型,也就这么回事,操作的都是同一个实例对象(子类实例对象),只不过是引用在变化,因为两者有继承关系。并且Person worker = new Worker();这条语句建立了两者的关系。

-----------------------------

回过头来看第二句,worker.say();照上面那么说,他会去找父类的say方法啊,怎么会执行子类的say方法呢?你如果这么认为,那你就被我骗了,哈哈哈。say方法被重写了,jvm就会调用被子类重写的方法,不要问我为什么,java语言就这么规定的,jvm就那么去实现。。。

原创文章,转载请注明出处:
http://blog.csdn.net/thinging_in_android

 

抱歉!评论已关闭.