关于Java多态性的问题,到底调用的是父类的还是子类的方法?

1、关于这个图中,ob的静态类型是父类(superclass),它只能调用父类自己的方法,这句话对吗?
2、如果上面这句话是对的,那么就不存在多态性了。子类继承父类的时候,会获得父类的方法(相当于子类拷贝了一份)还是在使用的时候仅仅是去调用父类的方法?
3、当父类的引用指向子类的对象的时候,子类改写了父类的方法。为什么父类的引用又可以调用子类的方法呢,感觉逻辑上不成立,呵呵
所以图上的第(5)个说的是调用subClass中的f1()方法,而第(6)调用的是superclass的方法,多以在那多态性中,在调用方法时,是有一种调用的顺序吗?如果子类改写了父类的方法就调用子类中的方法,如果子类没有改写父类的方法就调用父类的方法。

不知道这样理解对不对????

    不是调用父类自己的方法,而是与父类方法名相同的方法。

    对象调用方法的时候是先在自己的实际类型中找,没有才去父类里面找。

    引用归引用,但是他实际的类型是子类的类型,子类重写了父类的方法,所以调用的是子类的方法。

追问

哎手点快了,本来想继续追问上面回答者的,结果点成采纳的了。我在问题里说,子类继承父类的时候,会获得父类的方法(相当于子类拷贝了一份)。上一个回答者好像是同意的,但是看图中第(7)个,为什么不能调用f3()函数呢,我们老师说的是,它的静态类型是父类,它只能调用父类里的方法,不知道对不对?

你说调用方法时,现在实际类型中找,但是第(7)个f3()方法是能找到的啊,我感觉是先从父类里找呢

追答

就像人和学生一样,你可以说学生是学生,但不能说人是学生。因为你定义的是父类的类型,你就要符合父类的规范。父类没有的方法,你是调不到的。但实际上你这个对象是含有这个方法的,只不过他是你子类特有的方法,不属于父类。

追问

嗯嗯,想明白了。只是不好意思,已经采纳了

追答

没什么

温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2016-03-18
你也说了,是”子类继承父类的时候,会获得父类的方法(相当于子类拷贝了一份)“。
那么子类从父类继承的方法和父类就没有关系了,想怎么改就怎么改,就好比父亲是修汽车的,他把修汽车要用的知识全交给了你,但你有了这些知识不一定非要去修车啊,你不去修车,你父亲也不会因为这样而不会修车啊本回答被提问者采纳
第2个回答  2017-11-15
参考:
父类中有方法1,子类中未重写方法1;调用父类方法1;
父类中有方法1,子类中重写了方法1;调用子类方法1
父类中无方法1; 调用方法1时编译错误
第3个回答  2015-01-08
对的哦。。。。。。。。。追问

嗯嗯,谢谢哦

相似回答