楼主: jaly50
跳转到指定楼层
上一主题 下一主题
收起左侧

Berkeley CS 61B Data Structures(in Java) Homework4 加分+讨论帖

 
🔗
satiji 2019-5-8 12:52:07 | 只看该作者
全局:
satiji 发表于 2019-4-28 01:45
感谢楼主的测试代码!感谢2楼大佬对于多态的分析,自己来谈谈对于hw4以及对多态的理解:
P1:一开始对于Li ...

谢谢330楼的指正,我确实出现一个小错误,test里LockDList sl1=new LockDList()中创建的head节点本来就是DListNode类型的,这样所有节点其实都是本质为LockDListNode的DListNode节点
回复

使用道具 举报

🔗
不败顽童 2019-10-31 20:10:10 | 只看该作者
全局:
本帖最后由 不败顽童 于 2019-10-31 20:16 编辑

感谢楼主的测试代码。这次作业花了一天的时间,老是卡在几个点上面。通过自己查找资料以及地里朋友的idea,终于独立的完成了。1、对于part1,就是完成lab4里面的循环链表,如果做了lab4作业的,可以轻松的完成!但是要注意的点在于DList()这个空参构造器的时候,第一次凭直觉就写成了head=newNode(0,head,head),所以IDEA老是报空指针异常,通过调试以及资料终于找到问题所在!(这里提一下@shimei 以及@shendezhuti两位楼主都有提到,要是早点看到,我就不至于抓狂这么久了)。
head=newNode(0,head,head) 其实就是下面这四行代码 DListNode node = new DListNode();    node.prev = head;    node.next = head;    head = node;  这下问题就找到了,head这是根本就不存在,所以才会报错! 应该head=newNode(item,null,null),先创建head节点,然后再指向自己就完了。
2、对于part3才是这次作业的核心所在,再次感谢@shimei 以及@shendezhuti两位楼主的分析,让我顺利的理解了。
对于多态可以总结如下:
  • Fu fu = new son( );这就是向上转型,(对于成员方法而言)即编译看左边执行看右边,很好理解。此时所能用的方法只能是父类中的方法,子类独有的方法是看不见的。如果对父类的方法进行了重写,即能通过编译,但实际执行的是子类重写后的方法。(对于成员变量而言)即编译看左边执行也看左边,此时所能调用的实际上是父类的成员变量并不是子类中的。
  • 这个时候就能发现为什么作业中要设计newNode来构造节点。DListNode node =  new LockDListNode( ); 这里就是多态的应。同样现在所能用的方法是继承父类的方法(多态的好处就体现出来了,父类有点方法我们就直接用,对于程序的扩展以及维护就十分方便),若想对父类的方法有所改进,直接Override就完了。
  • 不过我们会想,那子类独有的方法以及成员变量怎么用了,总不能做摆设吧。这个时候就是向下转型,Fu fu = new son( );Son son = (Son)fu;这就搞定了,或者((Son)fu)。此时就强行转成子类对象了,对于子类里独有的成员变量和方法就可以随便点了,想点哪里就点哪里。
感谢这次作业的设计,让我对Java又熟悉了不少。程序有bug后,原来的我只会抓狂或者直接找答案,但在这几次的作业后,习惯用调试来看到底哪里出了问题,然后自己去想问题出在哪里!是没有理解到还是对语法没有掌握。不断coding总能进步!!!!











回复

使用道具 举报

🔗
不败顽童 2019-10-31 20:15:20 | 只看该作者
全局:
不败顽童 发表于 2019-10-31 20:10
感谢楼主的测试代码。这次作业花了一天的时间,老是卡在几个点上面。通过自己查找资料以及地里朋友的idea, ...

DListNode node =  new LockDListNode( ) 这里表达错了,此时的node是父类节点(即向上转型)。上面写成子类了。
回复

使用道具 举报

🔗
Sonic乘 2019-12-9 16:03:10 | 只看该作者
全局:
个人觉得并不是每个method都要重写;
只要重写了 newNode(),LockDList 其他的method都会call super.methods 然后 call newNode(); 这样创建的LockDList里面的node其实都是新的LockDListNode了
回复

使用道具 举报

🔗
Alansong641 2020-1-26 14:04:06 | 只看该作者
全局:
首先感谢楼主的测试code,附上截图:


主要的感想如下:

1、关于override和overload:
    //声明中的signature不能改变!否则不是override(重写)! return的是它的子类。signature中不包括花括号里面的return,里面的return可以是return type的子类
    //与overload(重载)不同,重载可见lab04

2、个人理解的dynamic type的作用之一

新加功能让这个node永久锁住!【这让我们知道如何新加功能】
  1.   public void lockNode(DListNode node) {
复制代码

         //cast:让父类转为子类,因为只有子类中LockDListNode中才有isLock属性

        //但是,如果用lockNode方法来处理。将那些需要lock的node由DListNode强制转换为LockDListNode.
        // 然后报错了【因为传入的DListNode其本质还是DListNode】...不是 LockDListNode.所以不能强制转换
        
  1.    ((LockDListNode) node).isLock=true;
复制代码


        //你new出来才有isLock这个field,如果new出来的还是父类,那就没有这个field了
        //如何改变new出来的值?利用重写(override)!!!!

        // 也就是说node new出来的必须是它的子类,看的是它的dynamic type!
        // 所以要重写(override)所有的与node中new相关的函数(newnode、constructor、insertfront、insertback)


3、那么static type有什么用呢?

        //我们知道在LockDList中每次生成新的结点时,该结点必须都是LockDListNode类型!!(dynamic type)
        // 之后,那些方法虽然传入的仍然是DListNode的static type,但其【本质】(new 出来的)已经全部变成了LockDListNode类型。

        //我们不需要知道LockDListNode到底是怎么实现的,甚至不用知道LockDListNode这个类的名字。这些都有人写好。
        // 然后我们直接使用LockDList来完成我们需要的操作(测试code中创建的dynamic type必须是子类的!见TestLockDList中第九行)
        // 同时依然用DListNode来接收相应操作返回的结点,其实此时这些结点的dynamic type已经发生了改变,但Java保证我们依然可以用父类来接收他们。

       这个超类就是static type。即public void lockNode(DListNode node) 中括号里的东西,这样做的好处是:
       如果我们在父类基础上新加功能,不用影响到main中测试的代码,因为它接收用的static type为父类。只需要new出来的dynamic type为有相关功能的子类即可:Father father=new son(.....);







回复

使用道具 举报

🔗
Alansong641 2020-1-26 14:11:46 | 只看该作者
全局:
Alansong641 发表于 2020-1-26 14:04
首先感谢楼主的测试code,附上截图:

有一点要补充的是,newnode的作用:
如果在insertFront() 和insertBack()函数中都用newnode()函数而不是用DListNode的constructor,
  1. head.prev = newNode(item, head, head)
复制代码
; 而不是
  1. head.prev=new DListNode(item, head, head);
复制代码

重写时就不用重写insertFront() 和insertBack()函数,只用一个newnode()函数就解决了!!!

这就是为什么要将constructor封装进newnode的作用!!因为constructor不能被override!
回复

使用道具 举报

🔗
shirring 2020-5-6 09:07:41 | 只看该作者
全局:
交作业来啦!!hw4 partIII还是有点难度的。主要是继承很混乱,虽然作业做了但是并不知道自己做的是不是对的

hw4.png (59.6 KB, 下载次数: 1)

hw4.png
回复

使用道具 举报

🔗
kcfc 2020-12-13 14:44:05 | 只看该作者
全局:
刚开始看这个作业不知道让干吗,后来昨晚lock的部分才感受到inheritance的精妙之处!




Homework 4(1).JPG (104.34 KB, 下载次数: 0)

Homework 4(1).JPG
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表