活跃农民
- 积分
- 366
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2015-2-1
- 最后登录
- 1970-1-1
|
本帖最后由 tinyrookie 于 2016-4-26 00:47 编辑
收获非常大的一次作业。part1很快就解决了,但是part3一开始没有搞明白。尽管自己之前对override了解过一点,但是还是不够透彻。借这次实战,加深了印象。总结几点:
1)类型转化:有两个基本知识点,每一个子类都是一个合法的父类,即LockDListNode一定是DListNode,所以把LockDListNode对象赋给DListNode引用是没有问题。反之赋值的话,需要使用casting,即显示类型转化,其中要求DListNode对象是由子类LockDListNode构造函数构造的。具体可以参考Java in a nutshell的subclasses & Inheritance一章。
2)关于override, 在Java in a nutshell里面定义是这样的:When a class defines an instance method using the same name, return type, and parameters as a method in its superclass, that method overrides the method of the superclass. 所以说我们在LockDList里面overrideDList的method的时候,prototype一定要完全一样。(ps: Java in a nutshell里面也指出,override时子类返回类型可以是父类返回类型的子类,也就是newNode方法可以返回一个LockDListNode,这种情况称为covariant return,是JDK1.5之后才被允许的,之前的版本不允许)
所以在override newNode的方法的时候,返回类型无论是DListNode还是LockDListNode都是正确的!总之:override的时候,只有返回类型可以不一样,而且这时候返回类型必须是subclass!参数列表必须完全一样!不然就是一个新的method!!!
补充:第三张图片是我在看java in a nutshell 讲子类和继承一章时的截图。在override remove函数的时候,可以直接调用super.remove(node)实现删除一个节点。假如我想调用的是父类的父类的remove的方法的话,是不是可以使用super.super.remove(node)呢?答案是不可以!
PS:czb层主的解析非常到位!
|
 组图打开中,请稍候......
|