zoukankan      html  css  js  c++  java
  • 图解Java多态内存分配解析


    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
  • 相关阅读:
    POJ 1141 括号匹配 DP
    881. Boats to Save People
    870. Advantage Shuffle
    874. Walking Robot Simulation
    文件操作
    861. Score After Flipping Matrix
    860. Lemonade Change
    842. Split Array into Fibonacci Sequence
    765. Couples Holding Hands
    763. Partition Labels
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3060171.html
Copyright © 2011-2022 走看看