Java面向对象—多态

1、多态:

具有表现多种形态能力的特征。

也就是说同一个接口,使用不同的实例化执行后得到不同的结果。

在java中,有继承关系存在时,当父类的引用指向子类的对象时,可以通过父类的引用调用子类重写的方法,实现多态。

2、多态的特点:

(1)继承的存在(没有继承就没有多态)

(2)子类中重写父类的方法(多态下调用的是子类中重写的方法)

(3)父类引用变量指向子类对象(子类到父类的转型)

3、案例:

现有Pet类中有宠物吃东西的方法eat(),有Dog和Cat两个子类继承了Pet类。重写Pet类中的eat()方法,有一个主人类Master。在该类中有喂养宠物的功能food()。实现主人喂养宠物。

在该案例中,我们会发现,主人给一个宠物喂食就需要写一个food()。如果宠物很多,那么food()也会有很多,代码冗余就很高,要解决这个问题,就可以使用多态来处理。

使用多态来实现该案例:

总结:多态就是子类继承父类,通过父类类型(引用)指向子类对象。执行相同的方法,结果却不一样。

多态的前提: 1、继承的存在(没有继承就没有多态) 2、子类中重写父类的方法(多态下调用的是子类中重写的方法) 3、父类引用变量指向子类对象(子类到父类的转型)

4、子类到父类的转型(向上转型)

父类类型    子类对象
Pet pet = new Dog();

(1)能调到什么左边决定,执行结果是什么右边决定

(2)pet能调到的方法必须是Pet中定义过的,调用时,先找子再找父,找到为止

(3)父类引用调到的是子类中重写后的方法,不是父类中的方法

(4)父类引用调不到子类特有的方法

(5)属性不具有多态性

5、父类到子类的转型(向下转型)

父类类型调不到子类中独有的方法,如果非要调子类的方法呢?就可以通过类型转换实现。

总结:如果想要父类引用能调到子类中独有的方法,那么就要对父类引用做转型,转为子类类型。也就是向上转换(强转)。

转为子类类型后就可以调到子类独有的方法了。

那么如果还想调另一个子类中独有的方法呢,我们会想到再进行类型转换,转为另一个子类类型。

接下来我们来看看是否可以?

结果发现执行报错了:类投射异常。

说明类型转换出了问题。在之前我们已经把父类引用转为了Dog类型。再转为Cat就转不了。因为Dog和Cat是同一级别。所以转换不了。

6、instanceof运算符

在Java中提供了instanceof运算符来进行类型的判断。

语法:

对象 instanceof 类或接口;

该运算符用来判断一个对象是否属于一个类或实现了有一个接口,结果为true或false。

在强制类型转换之前通过instanceof运算符检查对象的真实类型,然后再进行相应的强制类型转换,

这样可以避免类型转换异常,从而提高代码健状性。

7、父类类型做形参实现多态

现在增加一个主人给宠物喂食的功能,在主人类Master中,如果给狗狗喂食,就写一个food方法,传入狗狗对象。实现给狗狗喂食。给猫喂食也是一样,但是如果宠物很多,那么该类中就会有很多food方法。

所以我们就把传给food的参数改为父类类型:

在调用方法时传入子类对象,也相当于是父类到子类的转型实现了多态

8、案例练习:

(1)创建Person类,类中属性和方法如类图。创建Student类和Teacher类继承Person类。对Person中的show()方法进行重写。创建Test01进行测试父类到子类的转型和子类到父类的转型。

(2)再创建一个User类,类中有人工作的方法work();通过使用父类类型做形参来实现多态。创建Test02进行测试父类类型做形参实现多态。

9、父类类型作返回值实现多态

在Pet——Dog and Cat的基础上,增加一个宠物商店PetAgree类,类中有购买宠物的方法Buy(),该方法的返回值类型是父类类型Pet。在方法中可以返回子类对象。也相当于是父类到子类的转型来实现多态。

10、Object类型数组

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值