java继承性多态性封装性,面向对象总结2——关于封装性、继承性与多态性

0. 前言

第二阶段作业相对于第一次作业来讲难度加大了,自学内容也增多了,对java的涉及面也扩展了,主要对正则表达式、类的继承和多态有了较多的学习。

1. 作业过程总结

NO:1总结三次作业之间的知识迭代关系:

第四次作业知识上用到了类的组合和继承,第五次作业有对多态的要求,第六次作业有使用到多态和List的一系列操作方法,逐步地将面向对象的三大特征都慢慢强化。

NO:2如何通过作业逐步理解面向对象的封装性、继承性与多态性三大技术特性:

在前一阶段的学习中我们知道:在类中定义了自己的私有属性和方法,规范属性的范围,体现了面向对象的特征:封装性;而在这个阶段的练习中有较多的类继承关系的运用,像父子类的继承关系、抽象类的子类要全都实现父类定义的方法、子类重写父类的方法等等;而在第二阶段第三次作业中体现了三大特性之一的多态,多态体现了同一个行为具有多个不同表现形式或形态的能力。多态就是同一个接口,使用不同的实例而执行不同操作。

NO:3    作业过程中遇到的问题及解决方法:

第四次作业共有三题,难度递减:

第一题水文校验难度对我来说特别大,要使用Java中的字符串处理类以及正则表达式对输入字符串数据进行合法性校验及计算。由于第一次接触正则表达式,自学了一个下午的日期检验正则表达式的运用,了解了对日期格式的合法校验,但是这样远远还不够,由于C语言没有学好,所以这道题的的输入令我十分头疼,读题解题都花了我不少时间,样例真的可以把我直接劝退,在断断续续写了一段时间加一个通宵后,第一次提交运行测试点一个没过就打算放弃了。

第二题使用蒙特卡洛仿真方法求圆周率,一开始不晓得题目什么意思,去网上百度了百度上又说的那么复杂,磨蹭了点时间在解题上,后来读懂了题运行时出现了空指针错误,在类之间的调用和传值上面花了时间去排查,百思不得其解,还尝试着用面向过程的方法试着提交了几次,但都只过了几个测试点,后来改来改去发现自己的随机数产生的方法有问题,因为题目给的坐标条件有点特殊,不能盲目的看网上给的公式,最后用面向对象试着提交居然过了。

最后一题是实现图形类的继承,并定义相应类对象,这个如果要说的话就是在设计主函数的时候忘了调用set语句方法传值,导致后面运行输出的时候显示相同的值,能够出现这样的错误只能说自己的代码道路还很长很长。。。

总的来说这次作业凭着水文校验成功的在这阶段作业里面晋级难度五颗星,只有后面两道题得分。

第五次作业有两道题,难度递增:

第一题要掌握类的继承、多态性及其使用方法,通过常见的图形来进行计算面积、面积大小排序和求各图形的面积之和;当时在看指导书时对里面的这样句话纠结了不少时间——“根据图形的面积大小进行升序排序,要求必须对 list 中的图形对象在 list 中进行排序,而不是对求得的面积进行排序,排序后再次求出各图形的面积并输出。”后来在排序的时候发现前面那句话对测试点木有影响,想到怎么排序就怎么来;第一次运行后发现我的不同属性的面积值都是最后一个属性计算得到的面积,开始我以为是传值的时候后面的值覆盖掉了前面的值,后面又以为是输出有问题,最后我发现我被指导书上的“要求创建的各个图形对象均存储在 ArrayList类型的列表中。”给坑了,当时把图形面积用list.add都放在ArrayList类型的列表中再排序,后来发现可以直接用三个普通数组存放各个图形的面积值,再用System.arraycopy将三个数组合并,最后用Arrays.sort方法进行排序就完全ok。

第二题的多项式求导就没有这么简单了,开始花了一个通宵把我认为的框架搭好,后面运行出来的结果只有匹配错误的测试点能过通过,而正确表达式求导的三个测试点还是过不了。

第六次作业有两道题和一道加分题,前两道题是相互关联的:

第一题是图形卡片排序游戏,要掌握类的继承、多态性使用方法以及接口的应用。这道题开始做的时候看了指导书上的类图,发现他把问题想得太复杂了,为了过测试点还是立马果断抛弃了,直接上手自己的思路,当然了自己的思路偏向面向过程,但它并不妨碍我得出正确答案;这道题在排序上踩了坑,一开始受了第四次作业的图形排序影响,直接用Collections.sort排,发现他是按照整个字符串的大小排序,而不是按照字符串里面的面积排,所以我又自学了Collections.sort方法的重写,将面积前面的图形名称字符串用空格代替再次排序,又发现还是按数字字符串排序而不是按浮点数的大小排序,最后改了重写方法将数字字符串强制转换成浮点数类型再比较大小就ok了。

第二题是在第一题的基础上对不同图形分类进行排序,用到了arraylist和string的相互转换,和字符串的一系列操作。

加分的第三题求素数的练习,考查算法设计与优化有点意思了,用普通的方法来测试只能通过数值小的,而对于七位数的是没有输出的,第一次提交的时候发现运行超时,在改的过程中还出现了答案错误的情况,最后我在网上学习了“无尽算法之计数质数(厄拉多塞筛法)”才解决了这个超时运行的问题。

NO:4 每次作业花费的时间比例:

5:4:2

NO:5    对编程过程的严谨性的认识及教训:

我觉得在学习过程中要有自己的设计思路,不要一味的按照指导书上给的方案来思考,别人的方案不一定适合自己,但还是要尽量多使用面向对象的设计思路和方法,使用封装性、继承性与多态性三大技术特性让自己的代码得到更多的复用。

2.OO设计心得

①对面向对象三大技术特性之间关系的理解:

我觉得可以用一句话来概括:封装和继承目的都是为了代码重用,而多态目的是为了接口重用。

细细通俗地来讲封装就是类可以把自己的属性和方法藏起来,不容易让外界改变自己的值;

继承就是子类包含父类的属性和方法,不重复编码便可以使用他们,但是子类又不仅限于父类,他可以派生出自己特有的属性和方法,用高中数学解题思路可以解释继承的过程是一个“从一般到特殊的的过程”;

而实现多态有两种方法:重载和重写,目前的作业用到了重写方法(override)

Collections.sort(l);//对Comparator进行自定义重写:对字符串“Trapezoid:1.14 Rectangle:3.22 Circle:98.52 Triangle:4.02 ”里面的浮点数进行排序——“Circle:98.52 Triangle:4.02 Rectangle:3.22 Trapezoid:1.14 ”

Collections.sort(l, new Comparator() {

@Override

public int compare(Object o1, Object o2) {

return new Double(((String) o2).replaceAll("[A-Za-z:]", "")).compareTo(new Double(((String) o1).replaceAll("[A-Za-z:]", "")));

}

});

②面向对象设计的基本原则理解(单一职责原则及“开-闭”原则)

面向对象有五大原则:单一职责、开闭原则、里氏替换原则、依赖倒置原则和接口隔离原则现在来总结下前两个原则,其实对于我来讲老师给我们强调的最多的是单一职责(Single responsibility principle),简单来说他就是☞

一个类应该只有一个引起它变化的原因。即每个类都应该有一个单一的功能,并且该功能应该由这个类完全封装起来。

而我对于开闭原则的理解还不是特别深:

开闭原则(OCP)是面向对象设计中“可复用设计”的基石,开闭原则告诉我们应尽量通过扩展软件实体的行为来实现变化,而不是通过修改现有代码来完成变化,它是为软件实体的未来事件而制定的对现行开发设计进行约束的一个原则。

③类设计心得

通过画类图对类进行设计,先理清楚各个小问题之间的关系,再设计的类与类之间的关系,是依赖、继承、实现、关联、聚合还是组合。

3.测试的理解与实践

①测试对于编码质量的重要性

通过测试员对一个写好的代码进行边界测试,可以知道代码实现的功能和不足的地方。

②查阅资料,假设使用Junit进行程序的测试是否可行

使用Junit进行程序的测试是可行的。

4.课程收获

总结这四周来在OO方面的教训及收获

教训:我觉得还是要对面向对象的思路进行强化,很多地方一不小心就按照面向过程的设计方法去写代码了,以前学c语言的时候不好好学面向过程,现在要用面向对象去设计了又喜欢用面向过程解决问题。

收获:经过对这一阶段的作业训练、课堂作业的考察以及老师上课灌输的知识,让我逐渐体会到对面向对象的继承,多态还有代码的复用性等思想的巧妙。

5.对课程的建议

①第三阶段作业难度、题量的建议

希望老师能够考虑到编程菜鸟的解题速度,尽量在输入形式上不做强制要求,类图画的能够简单实用些。

②课程内容讲解方面的建议

老师课上能够结合具体实例来向我们讲解面向对象的各种思路和特性,是特别好的一件事,但作为一枚菜鸟更希望老师能够多细致地讲一下每次的作业,毕竟不是所有同学都能够全部实现测试点。。而且为了尽快完成作业通过测试点,很多地方没有考虑用面向对象的思路解决问题,这对于我们以后用oo解决问题很不利。

来源:https://www.icode9.com/content-4-685151.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值