查漏补缺5--从多态性的角度解释父类和子类的关系(继承、实现、多态的再理解)

我们知道子类重写父类的方法,在异常处理、方法返回值、权限修饰符有特殊的要求,具体如下:
① 子类重写方法的权限修饰符等于或者大于父类的被重写方法的权限修饰符
② 子类重写的方法的返回值类型是父类被重写方法的返回值类型的同类型或者子类
③ 子类重写的方法返回的异常类型是父类的被重写的方法返回的异常同类型或者子类

从多态性的角度来看,父类引用指向子类对象:
① 要使指向能够成功,必须要有足够的访问权限,所有子类的权限要大于父类的权限
② 父类引用指向子类对象,那么会使用父类中被子类重写的方法,那么父类的返回值类型必须能够涵盖子类的返回值类型,所以子类的返回值类型必须是父类的返回值类型的同等类或者子类
③ 异常类型其实也是一种方法出口,和②类似

ps:
继承、实现和多态的再理解:

① 子类继承父类,子类就拥有类父类的属性和方法,子类还可以重写父类的方法实现自己特殊的功能逻辑,还可以自己添加自己的属性和方法,从这个角度看,子类比父类拥有更强大的功能
② 继承带来的弊端是增加了耦合性,根据里斯替换原则,子类尽量不要重写父类的方法,表明继承的主要功能是我要使用父类的属性和方法,而不是修改你的属性和方法(主要用在多个类公共属性和方法时,继承基类)
③ 实现,就是给子类实现父类的方法的
④ 更进一步思考,按照依赖倒置原则,具体依赖于抽象,父类引用指向子类对象(更准确的说法是接口或抽象类的引用指向子类或实现类的对象)实现多态性,运用的正式子类重新父类的方法,这里的重点是子类重写父类的抽象方法,而不是重写已经实现且有具体逻辑的方法。
⑤ 概括来说:
1)继承就是我要用你的属性和方法,老老实实的用不要重写,增加了耦合性
2)要用多态,就实现接口,重写方法,父类引用指向子类对象
3)继承抽象类,也是使用我继承过来的属性和方法,重写要在多态性中使用的抽象方法,不要重写具体的方法(接口适配器模式四个例外),这两者有一个明显的界限,不要搅在一起。

这样理解的话,再看文章开头,子类重写了父类的方法,那就是要使用多态来解释这个问题了,要用到父类引用指向子类对象了,通过父类引用调用子类对象的方法了,那父类中的方法以及方法返回,子类中都要存在(因为子类还有自己特有的方法),所以子类方法的返回值必须是父类的同类或者子类(返回异常也是一样)(子类的返回值是父类的话,那父类的返回值作为子类不然会有子类的方法在子类的返回值父类中找不到)。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值