Java多态特性(学习推荐版)——java三大特性之一

定义

image-20231203143124159

image-20231203152349486

注意上图红字是强调在继承、实现情况下才会产生多态


记住:左边对象范围大(如父类,被实现的接口),右边对象范围小(如子类,实现的接口),也就是说左边对象包含右边对象,如人包含学生,人包含老师。


对第一张图中具体代码体现说明如下:

1.人既可以使学生,也可以是老师,例如青年时是学生,中年时突然成为老师了(对象多态)

2.run()方法,例如青年时学生跑得快,中年时跑得慢(行为或方法多态)

3.这样就体现了多态的好处,只需跟换对象(学生,老师),那么他们的行为也会随之改变,不需要修改所调用方法的代码


多态性具体案例理解

现在来看下面的具体案例,代码如下:

image-20231203143711982


口决:方法调用时编译看左边,运行看右边

解释:编译时(也就是写代码时)若左边对象中没有要调用的方法则会立马报错,运行时(也就是点击运行按钮后),若右边对象中没有要调用的方法则点击运行按钮后则去调用父类方法,有要调用的方法那当然就是这个要调用的方法咯


现在对上面的具体案例进行分析理解

*编译看左边(编译,也就是写代码时看有没有红色报错)

1.下面是编译看左边没有要调用的方法(不能正常编译)

image-20231203150619229

2.编译看左边正常情况(能正常编译)

image-20231203150836782

*运行看右边(点击运行按钮后)

在能正常编译后,再看具体执行那个方法(为了体现多态性)

1.运行看右边找不到要调用的方法

image-20231203151558886

输出结果为:人可以跑

2.运行看右边正常情况

image-20231203151216369

输出结果为:老师跑的慢


先编译(也就是写代码没红色报错),再点击运行按钮

上面综合案例运行时看右边的两种情况就解释了多态性,根据能不能找到要调用方法,其对应的输出结果就会不同。


注意事项

1.

image-20231203153320683

属性不谈多态性,见下面代码案例

口诀:编译看左边,运行看左边

image-20231203154040291


2.

image-20231203155147136

多态下不能直接调用子类的独有方法:就是假如子类有一个方法,并且这个方法没有重写父类方法,那么它就是独有的方法,而现在要调用这个方法,在编译阶段就不能编译了,因为父类中没有该方法(编译看左边)。要使用该子类独有的方法必须强制类型转换为子类。

现在看下面案例,子类Student独有方法为test(),要使用test必须强制类型转换

image-20231203160153011


3.

image-20231203161412062


对于强转后的ClassCastException错误,见下图:

image-20231203160910347

所以java建议用instanceof来判断真正编译时的类型 所以对于上面情况的判断语句需要这样写

 if(p1 instanceof Student) {//判断p1是否包含Student类
     //强制类型转换语句
     Student s1 = (Student)s1;
 }

要调用子类独有方法,并且解决强转后可能发生ClassCastException异常错误的最终解决办法见下图:

image-20231203161850411

分析运行结果:第一行和第三行当然是编译看左边,运行看右边啦,第二行和第四行就是子类的独有方法。


总结

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

莫青.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值