OO作业总结(二)

一、前言

pta三次作业题目说明

1、 Java_Homework5

1)水文数据效验及处理

2)蒙特卡罗方法求圆周率

3)图形继承

2、 Java_Homework6

1)   图形继承与多态

2)   一元多项式求导

3、 Java_Homework7

1)图形卡片排序游戏

扫描二维码关注公众号,回复: 11170441 查看本文章

2)图形卡片分组游戏

3)(加分题)求素数

二、作业过程总结

1、 三次作业之间的知识迭代关系

 

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

1)封装性:实现的细节经过封装对用户隐藏起来,这称为类的封装。

封装的步骤:修改属性的可见性来限制对属性的访问;为每个属性创建一队赋值和取值方法,用于对这些属性的访问;在赋值和取值方法中,加入对属性的存取限制。

一个类应该使用private修饰符隐藏其数据,以免用户直接访问它,这使得类更易于维护。只在希望数据可读的情况下才提供get方法。又只在希望数据域可更新的情况下才提供set方法。利用抽象数据类型把数据和基于数据的操作封装起来,使其成为一个不可分割的整体,数据隐藏在抽象数据内部,尽可能的隐藏数据细节,只保留一些接口使其与外界发生联系。用户无需知道内部的数据和方法的具体实现细节,只需根据留在外部的接口进行操作即可。

2)继承性:可以从现有的类定义新的类,这称为类的继承。

Java不支持多重继承,单继承使Java的继承关系很简单。一个类只能有一个父类,易于管理程序。父类是子类的一般化,子类是父类的特化(具体化)。

继承使得我们可以定义一个通用的类(即父类)之后扩充该类为一个更加特定的类(即子类)。在Java术语中,如果类C1扩展自另一个类C2,那么就将C1称为次类, 将C2称为超类。超类也称为父类或基类,次类又称为子类、扩展类或派生类。

Java继承的特征:继承关系是传递的;继承提供了软件复用功能;继承通过增强一致性来减少模块间的接口和界面,大大增加了程序的易维护性。

3)多态性:如果一个方法的参数类型是父类(例如Object)。可以向该方法的参数传递任何子类(例如circle类或string类的对象),这称为多态。

使用父类对象的地方都可以使用子类的对象。这就是通常所说的多态。多态意味着父类型的变量可以引用子类型的对象。方法的重写、重载与动态连接构成多态性。

父类中的一个方法只有在父类中定义而在子类中没有重写的情况下,才可以被父类类型的引用调用;对于父类中定义的方法,如果子类中重写了该方法,那么父类类型的引用将会调用子类中的这个方法,这就是动态连接。

子类是对父类的一个改进和扩充,所以一般子类在功能上较父类更强大,属性较父类更独特。定义一个父类类型的引用指向一个子类的对象既可以使用子类强大的功能,又可以抽取父类的共性。父类引用只能调用父类中存在的方法和属性,不能调用子类的扩展部分;因为父类引用指向的是堆中子类对象继承的父类;(但是如果强制把超类转换成子类的话,就可以调用子类中新添加而超类没有的方法了。)

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

1)水文数据效验及处理中的多条数据正确

原因:空格过滤得不够彻底。“由于人工输入数据可能存在疏忽,在每一个输入数据两端均可能存在多余的空格,程序应该能够自动过滤这些空格(不报错)”。

解决方法:检查并修改了效验数据和处理数据两步对空格的处理。

2)分割一元多项式的各个项及其系数

原因:对于java中正则表达式的各个用法比较陌生。

解决方法:用while + match去拆分各个项。

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

第五次作业:第六次作业:第七次作业 = 3 :2 :1

原因:第五次作业第一题水文数据效验使用的知识点较多,刚接触这一块的知识点,边学边写使用了较长的时间。后面两次作业难度没用增加,但是题量减少了,所以花费的时间也没有很多。

5、 对编程过程的逻辑严谨性的认识及教训

我的代码是按类图和题目要求一步一步写的,所以我的提交次数并不多。可是每次题目的通过率很低,一开始我并不理解为什么。在回答别人问题的之后,我明白了为什么。很多人写题目并没有按照题目要求去写。我们现在是初学者,编码的严谨性并不高,如果自己一味地横冲直撞,很容易写出很多bug。比如,在第七次作业,题目明确说了在Main类中定义一个静态Scanner对象,避免踩坑。但是仍旧有人声明了两个Scanner对象。大体上看完全找不出任何错误。其实在输入这里就有问题。但是因为我们很无知,所以很难去找出这些坑。

三、OO设计心得

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

“封装与继承几乎都是为多态准备的”。

2、 面向对象设计的基本原则理解

1)单一职责原则(SRP):对于一个类而言,应该仅有一个引起它变化的原因。

一个类有且只有一个职责。一个类可以包含多个方法,但是它们都是为了一个目的。如果一个类多于一个职责,则需要根据它们的职责把这个类拆分成多个类。因为每个职责是轴向变化的,如果类包含多个职责,代码会变得耦合。一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力。这种耦合会导致脆弱的设计,当变化发生时,设计会遭受到意想不到的破坏。

2)开放-封闭原则(OCP):软件实体(类、模板、函数等等)应该可以扩展,但是不可以修改。

开放-封闭原则是面向对象编程的核心所在。我们应该在不修改类的前提下扩展一个类的行为。对扩展开发,对更改封闭。对扩展开发意味着类或模块的行为能够改变,在需求变化时我们能以新的、不同的方式让模块改变,或者在新的应用中满足需求。

3、 OO编程思维的理解

OO(Object oriented)就是面向对象。面向对象有五个特性:万物皆对象;程序的对象的集合,他们通过发送消息告知彼此所要做的;每个对象都有自己的由其他对象所构成的存储;每个对象都拥有其类型;某一特点类型的对象都可以接受同样的消息。OO设计的主要任务是将设计尽量和现实世界的事物一致化。尽量使程序设计的思路符合现实世界事物的规律。类和对象是OO编程中最重要最基本的两个元素,在设计时,先将找到要处理的各个对象,再找到各个对象的共同的祖先,逐层抽象。最后确立各个类之间的继承关系。

4、 类设计心得

在第二阶段的学习中,大部分题目都给出了类图,让我们自己去完成。图形类图设计是一步一步教我们如何去优化自己的类。在类图里,有的类有set方法和get方法,有的只要set方法或者get方法,有的两者都没有。这让我逐渐理解了何为封装性。我们只在希望数据可读的情况提供get方法,又只在希望数据域可更新的情况下去提供set方法。设计类的方法时,要考虑类的职责只有一个。将类设计得简单。

四、测试的理解与实践

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

在水文数据效验和处理这一题,虽然我提交答案正确。但是在回答同学问题时,发现依照题目要求,我的代码依旧不够完善。测试有助于提高代码的质量。

2、使用Junit进行程序测试是否可行

可行。Junit这个插件十分方便,我以前测试程序是否正确,需要一点一点的运行调试,而是用Junit可以省时省力,而且还很全面。

五、课程收获

在第一阶段的学习里,我们学习了Java的基本语法。第二阶段的学习里,我进一步掌握了Java的三大特性(封装、继承与多态)、单一职责原则和开放-封闭原则。在练习与学习的过程中,我逐渐提高了代码的水平。在第一阶段的学习里,很多知识点只是了解了,但不会运用。在实现时间类图存在一定的困难,经过第二阶段的学习后,回过头去看,其实第一阶段的内容很简单。但是仍旧存在一定的缺陷,因为第二阶段的作业很少,所以第二阶段学习的时间反而没有第一阶段多。在总结的时候才意识到这一错误思想,不应该只为做题而做题。要学会主动去学习、复习老师所讲的内容。

六、对课程的建议

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

希望作业增加难度,涉及的知识点多一点。

2、课程内容讲解方面的建议

希望老师可以在上课前把课件发出来,让大家先预习。

猜你喜欢

转载自www.cnblogs.com/1134382543coming/p/12671414.html