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就那么去实现。。。
子类实例对象地址赋值给父类类型引用变量。多态的体现。
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就那么去实现。。。