OO(Java)程序设计第二阶段作业总结

前言

      本次博客同样是针对Java的三次大作业进行一个总结,Java课程的学习进度已然过半,通过PTA的几次大作业也是不断的巩固了自己学到的知识,本次博客就陈列出这几周的学习收获并浅谈一些自己的心得体会。

作业过程总结

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

            这三周的大作业相比与上三周而言没有明显的难度提升,每一次作业都有自己的内容,需要我们学习不同的知识用不同的方法解题。第一次作业的大头就是对于正则表达式的运用。尤其是第一题的水文数据校验及处理,这一题的难度主要是数据太多且对格式的要求严格。正因为如此,学会用正则表达式校验数据对这一题的帮助是巨大的,下面也是列出此次作业主要用到的正则表达式。

[1-9]\\d{3}/([1-9]|1[0-2])/([1-9]|[1-2][0-9]|3[0-1]) ([02468]|20|22|24|1[02468]):00  //用于时间年月日时分的格式校验,例如2015/8/5 2:00
([1-9][0-9]{0,2}\\.[0-9]{1,3})|([1-9][0-9]{0,2})  //用于实型数,取值范围为[1,1000), 小数点后保留1-3位小数或无小数(也无小数点)的校验,例如133.900或133
[1-9]\\.\\d{2}  //用于实型数,取值范围为[1,10),必须保留2位小数的校验,例如1.11

同时本次作业还使用到了Java的异常处理对输入日期数据的校验,如果输入平年2月29日等错误数据则程序会报异常,第二题的蒙特卡罗方法求圆周率主要使用到了Java的Random类生成随机数,通过判断误差是否小于1E-4确定是否成功求出圆周率,代码如下。

try {
                LocalDateTime time = LocalDateTime.of(year, month, day, hour, min);
                return true;
            } catch (Exception e) {
                return false;
            }     //异常处理

m1 = (x1-length/2) + new Random().nextDouble() * ((x1+length/2) - (x1-length/2));
n1 = (y1-width/2) + new Random().nextDouble() * ((y1+width/2) - (y1-width/2)); //生成随机数

            第二次作业开始涉及到了Java的继承,这也是Java学习的一个重点内容。继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。总的来说就是父类更通用,子类更具体。需要注意的是 Java 不支持多继承(即classC同时继承自classA和classB),但支持多重继承(即classC继承自classB而classB继承自classA)。学习Java的继承在创建一些同类型的class时可以大幅减少代码量。像这一次作业的第一题图形的继承与多态,Circle类,Rectangle类和Triangle类都属于图形因此也势必都具备图形的特征和行为(面积周长等),所以我们便可以创建一个Shape类,Circle类,Rectangle类和Triangle类这三个类继承自Shape类,这样一来可以节省代码量也使得整个代码更便于阅读。

class Shape{
    public Shape() {}
    public double getArea() {
        return 0.0;
    }
}
class Circle extends Shape{
        public double getArea(double width,double length) {
        return length*width;
    }
}
class Rectangle extends Shape{
    public double getArea(double width,double length) {
        return length*width;
    }
}
class Triangle extends Shape{
         public double getArea(double side1,double side2,double side3) {
        double l = (side1+side2+side3)/2;
        return Math.sqrt(l*(l-side1)*(l-side2)*(l-side3));
    }
}

            第三次作业则运用了Java的Comparable接口来实现对对象的排序并且输出,代码如下。本次作业还使用到了Java的抽象(abstract)类,Java抽象类并不能实例化对象,但是类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用。使用抽象类时也可以定义抽象方法,但子类必须重写这个方法。

class Card implements Comparable<Card>{
    @Override
    public int compareTo(Card o) {
        if(this.area>o.area)  return -1;
        else if(this.area<o.area)  return 1;
        else return 0;
    }
}

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

            从第一次作业的第一题水文数据校验可以很好的反应出Java的封装性的好处,这一题的数据复杂繁琐,如果全部堆在一个类中,那么不仅仅是代码杂乱难以读取,在后续的debug环节更是需要花费大量的时间,而代码的封装性的优点便是类内部的结构可以自由修改以及可以对成员变量进行更精确的控制,这样也可以更轻松的调试代码。而Java的继承与多态性则主要体现在第二次和第三次作业,多态存在的必要条件便是继承,重写与父类引用子类对象,继承如上面所说可以使得同一类型的类相互有联系,多态就是体现在继承中的子类重写父类的方法,这样可以使父类的一个行为具有多个不同表现形式,例如第二次作业第一题,Shape类中的GetArea()方法就被其三个子类Circle类,Rectangle类和Triangle类纷纷重写,使得这一方法具备多个表现形式。

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

            问题一:第一次作业的正则表达式不知道如何表示。解决方法:百度查找自学。

            问题二:第二次作业类的继承与抽象类的使用不是很明白。解决方法:百度查找相关视频自学。

            问题三:第三次作业不知道如何将数据排序且同时输出两组数据。解决方法:使用Comparable接口对类对象进行排序。

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

            时间比约为:第一次作业:第二次作业:第三次作业=2:1:1

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

            编程过程的严谨性不仅能够加快程序的完成速度,而且最重要的是能够让你的程序有结构有条理。这一点非常主要,尤其是在PTA上写作业时,常常提交后的结果不是答案正确,而是部分正确,这也就意味着程序有Bug需要你去把他找出来。如果你的程序没有条理,找Bug就需要从头找到尾非常繁琐,而如果写代码的时候严谨一些,找Bug的时候也能够大致判断错误在哪里,可以节省大量时间。

            教训:PTA上找Bug的时候就因为写代码时不够严谨代码太乱 ,导致找Bug的时间比写代码时间还要多。

OO设计心得

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

            Java的封装能够减少耦合,再使用到封装时可以使用private修饰符对成员变量进行隐藏,使得该变量只能被该类使用,也可以使用public修饰符编写对应的方法,这样做可以确保我们某些成员变量的密封性,只能通过方法来决定它们是否能被访问以及修改。同时在类中this这个关键词也特别好用,它可以调用到该类中的变量,可以很好解决重名的问题。继承与多态一般同时出现,多态性可以理解位继承的一种体现,继承指的是父类被多个子类继承,子类也就具有父类一样的方法但每个子类的方法又不一样,多态性便是指这个父类具备多个子类的表现形式。

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

            开-闭原则是面向对象编程最重要的原则,它使得代码具备可复用性。对于扩展是开放的,对于修改是关闭的,这意味着模块的行为是可以扩展的。开-闭原则使得代码修改也更加方便,调试程序时也更加简单。单一职责原则则表现为每一个类都应该有其独有的职责,可以一个或多个,但别的类不可以有相同的职责。这样同样是使得代码具备很强的可复用性,在解决一些类似的问题时部分代码可直接引用。

      3:OO编程思维的理解。

            面向对象编程在遇到问题时首先应该找出有几个可实例化的对象,并分析该对象具备什么行为与特征,分析完以后最好画一个UMI图,仔细思考应该如何设计类的结构,一开始不能向面向过程考虑。

      4:类设计心得。

            类设计应该遵循单一职责原则,尽可能使得代码可复用。同时分析是否可以设计一个抽象类与抽象方法,可以多考虑继承关系。

测试的理解与实践

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

            测试就像是工厂里面的质检员,它检验程序是否合格。不经过测试的代码一定是有Bug的,没有谁能够一次性创造出完美无瑕的程序。只有经过不断的测试,代码才能不断的变得更完美。

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

            可行。在Eclipse中已经将JUnit模块集成好了,开发者可以直接的在自己的项目中使用JUnit的测试模块,十分的方便。

课程收获

            学习Java也有不短的一段时间了,在这一期间从下载JDK安装Eclipse到开始学习Java的类结构,方法,继承关系,多态性,接口的使用,还了解到了Java的单一职责原则和开-闭原则,学会了新的面向对象编程,收获可谓是颇丰。以后更应该再接再厉,勤奋学习。

对课程的建议

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

            这三次作业的难度可以了,不会很难也不简单,非常适合现在的我们,通过作业能够起到巩固知识的效果,每次作业的题量我觉得可以在3~4道。

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

            课程内容老师讲得很好,建议老师可以在课堂抽些时间讲讲PTA上的大作业。

猜你喜欢

转载自www.cnblogs.com/lx2001/p/12813421.html