oo课程总结
oo课程博客作业总结
0、前言
经过本学期对面向对象程序设计的学习,对面向对象程序设计思想有了更深的理解,对java使用的一些方法也更加的熟练。本次博客是对本学期对面向对象程序设计学习思想及以往PTA作业完成的总结。
1、作业过程总结
本学期的PTA作业共分为三个阶段,三个阶段的作业所涉及的知识点循序渐进,逐渐深入,以下是对PTA三个阶段的作业进行总结;
①三个阶段作业内容总结
第一阶段的作业所涉及的知识点主要为对类与对象的基本认识以及对java基本语法的应用;
以下为第一阶段三次作业内容总结:
Homework1:本次作业主要考察对于基本Java编程语句的使用以及Java基本结构认识,包括对基本数据类型int、double、string等以及对数组的使用。对基本语句的考察主要为if else语句及for循环语句等。
Homework2:第2次作业主要考察对于函数(方法)的定义及使用,包括对于函数的调用及向函数的(方法)传参。
Homework3:第3次作业主要考察的是对类的定义以及对类的使用,对类中成员属性的封装将成员以private定义,以及对类中函数的方法的定义及调用。
第二阶段的作业主要针对的内容为对类的使用以及对类的性质(封装性、继承性、多态性)的学习并引出List、Map、Set的应用;
以下为第二阶段三次作业内容的总结:
Homework5:主要考察对类继承性的使用并考察正则表达式的应用;Homework6:主要考察对类继承性及多态性的使用,部分考察正则表达式应用;
Homework7:主要考察对类继承性及多态性的使用,并增加了对比较器comparable的应用及List类中方法的应用;
第三阶段的作业由对Java具体知识点的考察转变为对实际问题的解决,是对知识面较为全面的考察;
Homework9:需解决问题为通过控制杆及刻度盘操作次数控制车载雨刷器的运行速度。主要应用各类之间的相互传参及方法的调用,将任务分配于不同的类处理,考察对类关系的构建及是否符合类设计的基本原则;
Homework10:本次作业需解决问题为对代码关键字出现次数的检测。主要应用List,String类中对字符串的操作方法对字符串进行检验;
Homework11:本次作业解决的问题为对输入字符串进行检验并计算字符串计算结果。主要采用List列表及Stack栈的方法采用逆波兰的方法将表达式转化为后缀表达式再进行计算;
②三个阶段作业花费时间
第一阶段作业平均每次作业花费时间为2天左右;
Homework1:1天左右
Homework2:2天左右
Homework3:2.5天左右
花费时间比例: 2:4:5
第二阶段作业平均花费时间为2天左右;
Homework5:1.5天左右
Homework6:2天左右
Homework7:2.5天左右
花费时间比例为: 3:4:5
第三阶段作业平均花费时间为1.75天左右;
Homework9:0.5天左右;
Homework10:1.5天左右;
Homework11:2天左右;
花费时间比例为 1:3:4
③作业遇到的问题及解决方法
问题1:对Homework10中对字符串的检验时如何提高对字符串的检测效率,使字符串更加便于检测是否含有关键字。
解决办法:通过采用ArrayList将输入代码每一行分别保存为一个元素,通过对字符串每一行进行检验可得到对字符串含有关键字个数的结果。
具体实现方法:
Scanner input=new Scanner(System.in);
List<String> list=new ArrayList<>();
list.add(input.nextLine());
while(list.get(list.size()-1).equals("exit")==false) {
list.add(input.nextLine());
}
input.close();
问题2:Homework10中对不同关键字出现次数的统计保存按照制表格式输出的问题。
解决办法:创建Map键值对集合,将不同的关键字及它所出现的次数合为一个整体元素;以关键字为键,以关键字出现次数为值创建TreeMap将键值对自动排序制表输出。
具体实现方法:
Map<String,Integer> map=new TreeMap<>();
for(int i=0;i<string.length;i++) {
map.put(string[i], integer[i]);
}
Set<Map.Entry<String,Integer>> set=map.entrySet();
for(Map.Entry<String, Integer> entry:set) {
if(entry.getValue()!=0)
System.out.println(entry.getValue()+"\t"+entry.getKey());
}
问题3:Homework7作业7-1卡牌游戏中对各类图形卡牌面积进行排序并且计算各类图形卡牌的面积。
解决办法:创建ArrayList列表,在列表中存放各类图形对象;通过CompareTo比较器对对象进行排序并输出。
具体实现方法:
private ArrayList<Shape> list = new ArrayList<Shape>();
private ArrayList<Circle> list1 = new ArrayList<Circle>();
private ArrayList<Rectangle> list2 = new ArrayList<Rectangle>();
private ArrayList<Triangle> list3 = new ArrayList<Triangle>();
private ArrayList<Trapezoid> list4 = new ArrayList<Trapezoid>();
//创建ArrayList列表
class Shape implements Comparable<Shape>{
private double s;
private String name;
public Shape(double s,String name) {
this.s=s;
this.name=name;
}
public double getArea() {
return this.s;
}
public String toString() {
return this.name+":"+String.format("%.2f", this.s);
}
@Override
public int compareTo(Shape o) {
int x=0;
if(this.getArea()<o.getArea()) {
x=1;
}else if(this.getArea()==o.getArea()) {
x=0;
}else {
x=-1;
}
return x;
}
}
//对对象采用CompareTo比较器对ArrayList列表中的对象进行排序
④对编程过程的逻辑严谨的认识
在编写代码的过程中对代码编写的严谨性是十分重要的,对于基础的语法错误在编写代码时编译器会自动对错误进行提醒。因此,在编写代码时我们更加应该注意的是代码编写时的逻辑错误。较常出现的逻辑错误多为:计算出现分母为0、程序运行时出现数组越界、指针指向为空等;对于出现的逻辑错误在运行程序时编译器会对出现的逻辑错误进行捕捉并抛出(如下图),但不会对出现的逻辑错误进行处理并且不会对程序继续运行。

因此在遇到错误时除了可直接修改出现错误的代码外,还可采用try-catch-finally语句对出现的异常进行捕捉并处理(如下代码)。
try{
if (compareString(a,b))
System.out.println("Equal.");
Else
System.out.println("Not Equal.");
}catch(CompareException e){
System.out.println("Error: "+e.toString());
}
}
2、oo设计心得
①对面向对象三大技术特征之间关系的理解
面向对象三大特征:封装、继承、多态。
封装:类中包含了数据及方法,将数据和方法放在一个类中就构成了封装,同时采用private关键词定义类中的成人属性,控制对类中成员属性的访问权限。
继承:不同的类之中存在着单一继承关系。即一个类只能继承另一个类被继承的类为父类继承的类为子类,在继承中使用关键字extends实现类的继承。通过class A extends B,可实现A对B的继承。
子类可直接引用父类中的数据及构造方法,并对构造方法进行重写及扩充以增加类的不同功能
多态:在子类中对父类方法进行重写从而实现同一方法对不同对象可实现不同功能。其核心思想为父类的引用可以指向子类的对象。多态中包括两种类型的强制类型转换,一向上类型转换,二向下类型转换,通过类型转换,便可将子类转化成父类引用,将父类转化为子类引用。
类的良好封装能够使我们便捷修改类的内部实现,也是实现类继承及多态的基础,而多态的实现则是基于类之间的继承关系
②面向对象设计的基本原则理解
(1)单一职业原则:类的职责单一,不能将太多的职责放在同一个类中。
(2)开闭原则:软件实体对扩展是开放的,但对修改是关闭的,即在不修改一个软件实体的基础上去扩展其他功能。这也是基本原则中的最重要原则。
(3)里氏代换原则:在软件系统中,一个可以接受基类对象的地方,必然接受一个子类对象。
(4)依赖倒转原则:针对抽象层编程而不针对具体层编程。
(5)接口隔离原则:使用多个专门的接口来取代一个统一的接口。
(6)合成复用原则:在系统中应该尽量多的使用组合和聚合关联关系,尽量减少对继承关系的使用。合成复用原则能够维持类的封装性,使新旧类之间的耦合度降低,复用的灵活性提高。
(7)迪米特法则:一个软件实体对其他实体的引用越少越好,或者说如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用,而是通过引入一个第三者发生间接交互。使用该原则能够降低类之间的耦合度,提高模块的相对独立性,提高类的可复用性和系统的扩展性,并且能够减少暴露类成员,类本身不能改变降低对类的访问权。但过分的使用,该原则会产生大量的中间类和传递类,导致系统复杂度加大,因此要权衡使用迪米特法则,使系统构架清晰。
编写面向对象程序代码时,应权衡遵循基本原则,能够使程序结构更加清晰明了,提高程序效率以及程序的灵活性。
③对oo编程思维的理解
面向对象程序设计是从对象出发,以对象为主体,针对对象的各种属性即可实现功能去设计程序,将设计和现实世界一致化,尽量使程序设计的思路符合现实世界的规律。类和对象是面向对象程序设计的两个最基本元素,每个类都有着各自的成员属性及方法,可表现对象所具有的各种属性及实现的功能。就好比一个苹果。它的颜色、大小及它可以吃也可以售卖等。那么在设计对应的类似类中的方法及成人属性,便要对对象的属性即可实现的功能一一对应,并将其都封装于一个类中体现封装性。当然除了对类的单独设计外,还要考虑各类之间的关系,包括采用继承关系或聚合关系等。把要解决问题中所涉及的问题一个个分析清楚,找出彼此的差异和共同点,相互之间的联系,对于共性则定义为父类,使用继承和接口,并将父类尽量抽象化。同时还应遵循面向对象程序设计的六大原则。使所设计的程序代码可复用性高,便于扩充其他功能提高系统的可维护性。
3、测试的理解与实践
测试对于程序设计来说是十分必要的。程序在最初编写完成时会存在部分问题,通过测试便能将程序所出现的问题反馈出来,通过测试的反馈对程序的代码进行修改,便可提高代码的质量,减少程序在运行时可能出现了错误,提高程序的运行效率。
4、课程收获
通过本阶段PTA作业及以往作业的学习对面向对象程序设计课程有了些许收获;
(1)编程思想
在对面向对象程序设计课程学习后对oo设计思维有了更深的了解,oo编程以对象为主题,以类为基本单元。通过对类的构建解决实际问题。在构建类时需要注意遵守oo程序设计的几大原则(单一设计原则、开闭原则等)
(2)Java编程的方法(函数)
对List、Set、Map三大集合的用法
List用法

运行结果:

Set用法:

运行结果:

Map用法:

运行结果:

5、对课程的建议
(1)可适当放缓讲课速度,便于学生消化理解新的知识点;
(2)在讲课时可多提出一些关于所讲知识点的例子,使所讲知识点更加形象化;
浙公网安备 33010602011771号