[java基础揉碎]面向对象多态

目录

问题引出多态: 

 代码如下:

多态(多种状态)的介绍:

多态的具体体现:

方法的多态:

 对象的多态:

我们用多态解决最上面的问题:

​编辑 ​编辑

 多态的注意事项和细节:

多态的向上转型:

​编辑

 多态的向下转型

属性的重写问题


 

问题引出多态: 

 代码如下:

新建一个食物类

 食物类下面有两个子类:一个鱼类 一个骨头类

 

创建一个动物类:

 下面两个子类: 一个猫类 一个狗类

 

在创建一个主人类: 

 

 给主人添加给动物喂食的方法:

分别初始化动物和食物再去调用那个方法就实现了上面的问题: 

 如果主人还想要喂猫 ,再在主人添加一个喂猫的方法:

 再去初始化调用就可以了:

以上代码从功能上来说没有一点问题,  但是有一点问题, 如果动物很多, 事物也很多, 主人类就需要添加特别多的 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的子类: 

 

  • 24
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值