目录
问题引出多态:
代码如下:
多态(多种状态)的介绍:
多态的具体体现:
方法的多态:
对象的多态:
我们用多态解决最上面的问题:
编辑 编辑
多态的注意事项和细节:
多态的向上转型:
编辑
多态的向下转型
属性的重写问题
问题引出多态:
代码如下:
新建一个食物类
食物类下面有两个子类:一个鱼类 一个骨头类
创建一个动物类:
下面两个子类: 一个猫类 一个狗类
在创建一个主人类:
给主人添加给动物喂食的方法:
分别初始化动物和食物再去调用那个方法就实现了上面的问题:
如果主人还想要喂猫 ,再在主人添加一个喂猫的方法:
再去初始化调用就可以了:
以上代码从功能上来说没有一点问题, 但是有一点问题, 如果动物很多, 事物也很多, 主人类就需要添加特别多的 feed 的方法, 所以出现了代码复用性不高, 而且不利于维护
怎么解决呢, 利用多态!
多态(多种状态)的介绍:
方法或对象具有多种形态。是面向对象的第三大特征,多态是建立在封装和继承基础之上的。
多态的具体体现:
方法的多态:
方法的重载, 重写就能体现多态
根据对象的不同, 调用的say也不同就是一种多态
对象的多态:
(1)一个对象的编译类型和运行类型可以不一致
(2)编译类型在定义对象时,就确定了,不能改变
(3) 运行类型是可以变化的
(4)编译类型看定义时=号的左边,运行类型看=号的右边
代码中这么使用怎么体现呢, 如下:
新建一个动物类:
新建一个子类面猫类, 并重写父类的cry
在写一个子类狗类, 也重写父类的cry
这时运行:编译类型是动物类, 运行类型时狗子类 , 在用动物类去点方法的时候, 运行的就是狗子类的方法:
我们用多态解决最上面的问题:
直接将传的参数Dog, Bone和Cat, Fish直接改为他们的父类 Animal, Food , 因为父类可以直接指向(接收) 他们的子类:
多态的注意事项和细节:
多态的前提是:两个对象(类)存在继承关系
多态的向上转型:
1)本质:父类的引用指向了子类的对象
2)语法:父类类型引用名= new 子类类型()
3)特点:编译类型看左边,运行类型看右边。可以调用父类中的所有成员(需遵守访问权限), 不能调用子类中特有成员; 最终运行效果看子类的具体实现!
子类重写了父类的方法在调用方法时就会先从子类开始查找方法:
为了能够调用子类中特有成员, 便有了向下转型
多态的向下转型
1)语法:子类类型引用名=(子类类型)父类引用
2)只能强转父类的引用,不能强转父类的对象 (好比说小明是个具体的人, 不能改变小明这个人, 但是这个人的身份以前是学生, 后来当官了, 他的身份地位发生变化)
3)要求父类的引用必须指向的是当前目标类型的对象
4)向下转型后, 可以调用子类类型中所有的成员
但是如果现在指向狗可以吗?
是不可以的, 因为之前这个animal之前创建的对象是cat:
属性的重写问题
属性没有重写之说, 编译类型是多少就是多少:
instanceOf 比较操作符,用于判断对象的运行类型是否为XX类型或XX类型的子类型
以下为false, 因为obj不是AA的子类: