面向对象三大特性:封装、继承和多态。 今天学最后一个特性:多态。 什么叫多态呢?按照字面意思理解就是多种形态的意思。 还是举昨天的那个例子: 动物园里动物都得吃食物,兔子吃胡萝卜,猫吃鱼,狗吃肉。 同一行为(吃东西),通过不同的事物(兔,猫,狗),可以体现出不同的形态(兔子吃胡萝卜,猫吃鱼,狗吃肉),这就叫多态。 一、多态的格式1.格式说明:父类引用指向子类对象。 具体什么意思呢? 变量有基本数据类型和引用数据类型。 其中引用数据类型又分为:数组,类和接口。 父类类型指的是子类继承至的父类,或者子类实现的接口。 按照现实里面的理解就是:一个是亲爹一个是干爹。 2.要存在方法重写 其中父类引用(也就是图中的Zoo)在调用方法时,会先看自己有没有这个方法(eat方法)。 如果没有eat()方法,编译会报错; 如果有这个方法,会执行子类重写后的方法, 口诀就是:编译看左边,运行看右边 就比如上图中:zoo.eat() ①编译会先看左边,Zoo接口中有没有eat()方法,有,编译通过。 ②运行结果看右边,是Rabbit对象,那么会执行Rabbit中重写的eat()方法,也就是“兔子吃胡萝卜”。 二、多态的好处既然是面向对象三大特性,那它有啥好处呢? 当父类类型作为方法形式参数时,更能体现出多态的扩展性与便利。 现在要展现动物的eat()方法和sleep()方法。 如果不使用到多态,常规用法,代码如下: 就是每一个动物都得建立一个对象,并且建立其对象对应的show()方法。 那么问题来了,动物园里那么多动物,每个动物都建一个show()方法,会显得特别繁琐。 如果应用到多态的话,就会简单很多。 代码如下: 每一个动物就建立对象,但是只需要一个show()方法就可以了。 show()方法参数是父类类型的引用。 这样无论建立多少个动物对象,只要是子类,都可以将参数传入这个方法,直接使用。 这就叫代码的可拓展性,以后无论是删减哪种动物,或者是添加哪种动物,这个方法都可以使用,不用改变。 三、多态的弊端多态这么方便,那它有没有什么弊端呢? 是有的。多态不能调用子类的特有方法,需要使用到强制转换。 那么父类引用zoo就不能调用这个特有的方法。 需要使用到强制转换,也就是(Rabbit)zoo。 格式为:(类型名)变量名。 注意: 上面这段代码,编译是没有问题的,但是运行会报错。 ClassCastException,中文就是:类转换异常。 其实很好理解,变量zoo定义的时候,本来是子类dog对象,现在强制转换成子类Rabbit,自然没法运行。 为了避免出现类转换异常,Java提供了一个关键字:instanceof,给变量名做类型的校验。 格式为:变量名 instanceof 类型
总结: |
|
来自: 刘小爱v > 《Java学习笔记》