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

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

 
🔗
jiamuxeuer 2015-3-31 16:16:07 | 只看该作者
全局:
本帖最后由 jiamuxeuer 于 2015-3-31 17:31 编辑

HW4 用了LZ的TestDList.java 和 TestHelper.java. 完成Part1

QQ20150331-1.png (142.59 KB, 下载次数: 0)

HW4

HW4

评分

参与人数 1学分 +1 收起 理由
whdawn + 1

查看全部评分

回复

使用道具 举报

🔗
jiamuxeuer 2015-4-1 16:20:13 | 只看该作者
全局:
本帖最后由 jiamuxeuer 于 2015-4-1 16:29 编辑
AveMaleficum 发表于 2015-3-28 13:21
整整两个晚上,果然基础还是太弱了。反复看了前面的讨论还有Git上的参考,终于发现我居然Part1忘记用newNod ...

Hi~我的也是front 还有back 这地方有问题,改了之后还是报错啊 list.DListNode cannot be cast to list.LockDListNode T T 而且我也改了newNode的地方了。。。
额,我在DLockList 里面overload 了 front() 和 back() ,也就是修改了返回值,就可以了。 不过我这要是不overload的话,直接cast还是会出错。。╮(╯_╰)╭~真是被这些弄晕了。。

补充一个Part 2 的 TestLockDlist 的完成图~ (才发现原来已经不能编辑之前的发言了~额。。)

QQ20150401-1.png (147.49 KB, 下载次数: 1)

QQ20150401-1.png
回复

使用道具 举报

🔗
rockleecsu 2015-4-8 06:05:34 | 只看该作者
全局:
感觉这次作业比以往的要难很多阿。。
虽然做出来也不是非常费劲,但是感觉还是有很多不理解的,尽管还是实现了。。。
看来还是得多看书。。
求加分!!


p.s:感谢楼主的测试程序
p.p.s:感觉还是不够完善,可以加上对测试lock之前和之后的影响。。。

评分

参与人数 1学分 +1 收起 理由
jaly50 + 1

查看全部评分

回复

使用道具 举报

🔗
erich04 2015-4-11 22:35:59 | 只看该作者
全局:
eclipse编写的,有了前面帖子里 override 了remove函数的部分所以不难。就是最后的地方 。node.item的地方结果老是null 而不是3,自己改咯好久,大家有这个问题吗?

更多图片 小图 大图
组图打开中,请稍候......

评分

参与人数 1学分 +1 收起 理由
whdawn + 1

查看全部评分

回复

使用道具 举报

🔗
erich04 2015-4-14 10:25:21 | 只看该作者
全局:
话说好不容易弄出来了,求学分,THX
回复

使用道具 举报

🔗
czbnlzd920706 2015-4-27 08:28:29 | 只看该作者
全局:
这次作业一开始轻视了。然后做到part3的时候才发现,有难度,而且难度不在于算法构造,而在于对于Java多态,继承的理解,对 超类转子类,子类转超类的理解。还有,为什么用继承对于工程设计来说会更加方便。所以正好在这里总结下,方便以后自己回头复习。
1.子类转超类
Father father = new Son();
此时,是向上转型。Son是子类,相较于父类来说,其功能更加强大复杂。但是向上转型后,父类中不存在但子类中存在的方法不会被包含到对象中,同时子类的field也不会被包含到该对象中。如果子类的某个方法与父类完全相同(返回值类型也必须相同),那么,该引用中的该方法会被重写(overrride)。但是,即使是相同名字的field,也不会被重写。也就是说,我们虽然用父类引用接收了子类对象,但我们却可以使用具有子类特色的方法。正如此题中,我重写了 remove(),newNode()方法。
overload,重载。指的应该是,完全重新构造了一个同名的方法,但该方法的返回值类型和输入参数与父类必须都不同。如果输入参数相同但返回值类型不同,我测试过,编译器错误。
重载(overload)时,同名同参数的方法,其返回值类型必须与父类相同,并且,其权限必须更高!
比如说,父类是protected,子类必须是protected or public. 若父类是public,则子类必须是public。
另外,子类转超类必须要明白的一点是,(此处摘抄自网络博客)
当我们用一个类型的构造器构造出一个对象时,这个对象的类型就已经确定的,也就说它的本质是不会再发生变化了。各种类型的转换,只不过是他的能力被临时消弱了而已(能力被削弱的意思是你访问这个对象用的指针能看到这个对象的多少的功能,虽然这个对象有很多的功能摆在那里),其本质的东西并没有任何的变化(这句话是重点)。


所以说,father 这个引用所指的内存块仍然包含那些子类特有的方法,但是该引用"看不见"这些方法。

2.超类转子类
Father father = new Father();
Son son = (Son) father;
这个情况下编译器会报错, Cast Exception
正如我刚说的,超类可以强制转换为子类,但前提要求是,该超类其本质(额。。自学的,所以专业术语不到位,见谅。。)必须是子类。
所以这么做是对的:
Father father = new Son();
Son son = (Son) father;



3.extends
当子类继承父类时,什么会被继承过来:
super类中的protected,public都可被子类继承,包括field 和 method.
同时,如果子类自己的某个field或者method与父类完全相同(prototype),那么,该field或method将会覆盖父类相对应的field或method。
同时,父类的构造器不能被继承,但必须被子类构造器调用!


public class Father {
    int a;
    public Father(int x) {
       this.a = x;
    }
}

public class Son extends Father {

}
报错。编译器会寻找Son类中的构造函数。但是没找到,就执行default constructor,
Son() { }
然后编译器进入该构造器。他没有发现super关键字,默认执行 super();(构造函数不能被继承,但必须被调用!)
然后去父类中找super()构造函数。没找到。于是就会报错。
所以应该是,
public class Son extends Father {
      Son(int x) {
         super(x);
     }
}

我之前在想,为什么一定要在子类构造器中最先一步,调用父类构造器。现在觉得,通过调用父类构造器,将子类从父类那里继承过来的成员先按照父类的规则进行初始化。然后,再由我们自己进一步设计具有该子类特色的初始化方式。

之前一直对继承这个东西用处多大,不是很清楚。现在的想法是:
一开始我设计了DList,DListNode这样的最基本的链表。功能也是最基本的。
后来用着用着发现不够用了,需要添加一些新的功能,比如,锁住某些节点让其不能被删除。
于是我新写了一个类LockDListNode extends DListNode. 然后里面加入了boolean isLocked。
但是如果仍使用DList中的方法insert,remove,forward,back....来处理LockDListNode.就会发生类型转换错误。
我一开始的想法是,用lockNode方法来处理。将那些需要lock的node由DListNode强制转换为LockDListNode.然后报错了,因为传入的DListNode其本质还是DListNode...不是 LockDListNode.所以不能强制转换。
所以必须想一种方法,在LockDList中每次生成新的结点时,该结点必须都是LockDListNode类型,然后返回值是DListNode,从而在返回过程中完成向上转型。之后,那些方法虽然传入的仍然是DListNode类型,但其本质已经全部变成了LockDListNode类型。这个时候我才发现了 newNode() 的作用。老师让我们生成所有结点不要通过DListNode的构造器,而是通过这个newNode()来调用.就是因为该newNode()可被子类重写,创建出新的类型的结点。然后之后的其他链表操作可以完全继承不用改写,依然可以正常工作。(当然除了remove() )
所以我觉得楼主给的测试代码中,TestLockDList.java 有块地方有问题.
newtest(LockDList sl1)中,不应该用LockDListNode来接收 s11.front()的返回值。而应该用 DListNode 来接收,这才能体现出Java三大特性,封装,多态,继承,给软件设计带来的方便。我们不需要知道LockDListNode到底是怎么实现的,甚至不用知道LockDListNode这个类的名字。这些都有其他人写好。然后我们直接使用LockDList来完成我们需要的操作,同时依然用DListNode来接收相应操作返回的结点,其实此时这些结点的本质已经发生了改变,但Java保证我们依然可以用超类来接收他们。


不知不觉写了这么多。之前在阿里的同学和我说,Java的多态和继承是面试必考题,所以学得比较认真。但是自学的毕竟也是自学的,术语什么的都不到位,理解肯定也有错误。欢迎讨论。
附上我参考的几个博客,写的都很好。可以看下。
http://www.cnblogs.com/chenssy/p/3393160.html
http://www.cnblogs.com/chenssy/p/3372798.html
http://www.cnblogs.com/stemon/p/3394464.html



















更多图片 小图 大图
组图打开中,请稍候......

评分

参与人数 21大米 +92 学分 +1 收起 理由
kcfc + 1 受益匪浅!
shendezhuti + 1 给你点个赞!
jesse1204 + 1 很有用的信息!
ff12 + 5 很有用的信息!
leonYuuuu + 3 分析的很客观

查看全部评分

回复

使用道具 举报

🔗
whdawn 2015-4-27 16:03:48 | 只看该作者
全局:

这次的作业还比较简单,主要是了解清楚继承的概念和一些细节,感觉Head First Java这本书写的很清楚~




回复

使用道具 举报

🔗
默de途 2015-5-1 21:48:03 | 只看该作者
全局:
挣扎了许久终于结束Homework4,卡住了好久好久……
求学分~继续加油!
更多图片 小图 大图
组图打开中,请稍候......

评分

参与人数 1学分 +1 收起 理由
jaly50 + 1

查看全部评分

回复

使用道具 举报

🔗
amyzen 2015-5-6 13:17:10 | 只看该作者
全局:
本帖最后由 amyzen 于 2015-5-6 13:25 编辑
jiamuxeuer 发表于 2015-4-1 16:20
Hi~我的也是front 还有back 这地方有问题,改了之后还是报错啊 list.DListNode cannot be cast to list.L ...

Hi~ 我开始也碰到eclipse 提示list.DListNode cannot be cast to list.LockDListNode,我觉得问题不在于newNode或者front(),back()的overload,当然这样改是肯定可以通过的,原因在于front()和back()方法中并不会call newNode方法,所以返回的head.next和head.prev还是DListNode类型,而在 testLockDListNode中back和node定义的是LockDListNode类型,所以在test文件中直接操作会出错,我试了一在test文件中将返回值直接cast,如node = (LockDListNode)sl1.front(); 可以通过,跟overload front()的效果一样呢~
回复

使用道具 举报

🔗
amyzen 2015-5-6 13:20:15 | 只看该作者
全局:
交作业~~~~~



评分

参与人数 1学分 +1 收起 理由
jaly50 + 1

查看全部评分

回复

使用道具 举报

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

本版积分规则

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