个人对JAVA中的继承和多态的一些理解

       面试了很多家公司都被刷了,所以不妨放下心来,老老实实地敲些代码,以前觉得自己看了好多东西知晓个大概,觉得挺牛的,实际上不然,面试官一个小问题就卡死我了。就比如说面试官问我这个问题:子类如何调用父类的方法?我支支吾吾回答了个SUPER关键字,然后就开始崩了。

        好的步入正题,本次演示用到两个类:一个Animal类,只在里面写一个eat方法,输出"i eat glasses",另一个类是Cat类继承于Animal,重写eat方法,输出"i eat fish"。 

                                             

                           

Animal aCat =new Cat();这个声明体现了JAVA一个重要的特性:多态。

输出结果为:

i eat fish    

即是调用了子类的方法。(附:用this.eat()也是一样的)

然后问题来了:如何调用父类方法?

我的思路是,在子类中自定义一个函数,里面再调用父类方法。

于是我在子类里写了自定义了一个animalEat()方法,里面调用父类的eat方法,结果在main函数里不能使用这个方法???

而且给我的报错是:Animal类没有定义这个animalEat方法????情况如下图:

                         

根据代码提示,我把这出错行改成了:((Cat) aCat).animalEat();这就不报错了,而且也输出了"i eat glasses!"这个正确结果。为什么呢?居然还要我强制类型转换??是不是可以理解为这个aCat实质上是一个Animal类而不是Cat呢?

好的最后我得到以下结论:父类的引用指向子类的实例,在可见性上,这个实例是个父类,但是这个父类在调用方法时,若没被重写,就调用自己的,若被重写,就调用这个子类的。

有什么好处?我们开发过程中,往往需要拓展或改变我们原来的方法,这时候多态就派上用场了,新建一个类继承于原来的类,把需要改变的方法重写了,再写一个父类的引用指向子类的实例,这样我们用的还是原来的类,但是用的我们重写的方法。这就是面向对象的一大特性,多态。

       

猜你喜欢

转载自blog.csdn.net/weixin_38785199/article/details/82490890