java面向对象-多态

java面向对象-多态


什么是多态?

  • 多种形态,多种状态,编译和运行有两个不同的状态

  • 编译期叫做静态绑定,运行期叫做动态绑定

  • Animal a = new Cat();
    a.move();
    编译的时候编译器发现a的类型是Animal,所以编译器会去Animal类中找move方法,找到了,绑定,编译通过。
    但是运行的时候和底层堆内存当中的实际对象有关,真正执行的时候会自动调用“堆内存中真实对象(cat)”的相关方法。

  • 多态的典型代码:父类型的引用指向子类型的对象

  • 即同一方法可以根据发送对象的不同而采用多种不同的行为方式

  • 一个对象的实际类型是确定的,但可以指向的对象的引用的类型有很多

注意点

  • 父类没有独有的方法,因为父类所有的方法都会被继承了
  • 多态是方法的多态,属性没有多态
  • 存在条件: 继承关系,方法需要重写,父类引用指向子类对象

多态在开发中的作用

我们通过一个小案例来来理解多态在开发中的作用!
在这里插入图片描述首先,我们先不用pet这个父类,用普通编程思想来实现这个小案例,我们先编写一个主人类,主人类中有feed方法,然后再编写Dog、Cat宠物类,它们都有一个eat方法,然后再编写测试类实现主人喂宠物
注:这并不是宠物类子类!!!

在这里插入图片描述通过上图,我们可以看出每当主人需要喂养新的宠物时,那么主人类中就必须新增一个方法,不然主人喂养不到新的宠物,就比如主人现在需要喂养新的宠物鹦鹉,我们需要编写一个鹦鹉类,那么主人类中就必须要新增一个新的feed方法,从而实现喂养鹦鹉!!!

我们可以将喂养新宠物鹦鹉代表客户产生了新的需求,作为开发人员,我们必须满足客户的需求!

我们在不使用多态机制的前提下,目前我们只能在Master类中添加新的方法。

思考:修改Master类这个类有什么问题?
从这里我们看出,主人类与宠物们之间的联系程度特别高(高耦合),每当主人喂养新的宠物时,主人类中的代码就必须修改!这样的设计思想是不符合我们的开发原则(ocp)的!!!

什么是ocp(开闭原则)?
就是软件在扩展过程当中时,代码修改量越少越好,修改的越多,你的系统当前的稳定性就越差,未知的风险就越多!

这时,我们就需要使用多态机制,主人的feed方法中的形参不应该写死,不要写具体的对象,应该写一个更加抽象的类型,所以我们就需要写一个父类(pet),父类中也有一个eat方法,宠物们去继承这个父类,重写eat方法

这样每当需要喂养新的宠物时,主人类就不需要修改
在这里插入图片描述如图看出,主人类只有一个方法,但是宠物们都可以喂养到,每当zhangsan需要喂养哪个宠物时,只需要把实例对象丢到这个feed方法中就好了。

如zhangsan.feed(cat); 它运行时父类方法是这样的

//这里有个自动转换:Pet pet = Cat cat; 也就等于Pet pet = new Cat();
public void feed( Pet pet = new Cat() ){
		pet.eat();
	}

Pet pet = new Cat():父类型的引用指向子类型的对象

编译的时候编译器发现pet的类型是Pet,所以编译器会去Petl类中找eat方法,找到了,绑定,编译通过。
但是运行的时候和底层堆内存当中的实际对象有关,真正执行的时候会自动调用“堆内存中真实对象(cat)”的相关方法,也就是Cat类中的eat方法!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值