第二次blog

(1)前言: 我觉得4~6次作业难度对于我来说稍微有大,每次写都需要先去学习其他人的代码,在修改bug的时候也非常痛苦

  知识点:

      第四次作业:

      7-1 水文数据校验及处理 :此道题主要是运用java的正则表达式进行字符串处理,难度较大。

      7-2 日期问题面向对象设计(聚合一):主要是类的聚合问题,按照题目给出的类图进行代码编写,此道题的类的嵌套比较复杂,在进行代码修改的时候难度很多,要梳理清楚类的                                                                                         嵌套关系,不要被它绕进去。

      7-3 图形继承:类的继承与多态:根据题目可以了解到,这道题主要是考察类的继承与多态,如何去继承,继承什么,如何去重写父类的方法,这道题难度较小。

      第五次作业:

      7-5 日期问题面向对象设计(聚合二):这道题和第四次作业的日期问题很相似,但是在类的聚合的方法上有很大差别,在这两道题上要体会不同聚合方式 的优缺点。

      7-4 统计Java程序中关键词的出现次数:这题主要是对java正则表达式和集合,涉及知识点较多,难度较大。

      7-2 合并两个有序数组为新的有序数组 ;7-3 对整型数据排序:这两道题的知识点差不多,都是对数组处理,比较简单。

      第六次作业:

      7-1 ~7-4:简单的正则表达式训练。

      7-5 图形继承与多态:此道题主要还是考察类的继承和多态,同时了解抽象类的使用方法 。

      7-6 实现图形接口及多态性:这题主要是关于接口的使用以及多态。

(2)题目设计与分析

  ①题目集4(7-2)、题目集5(7-4)两种日期类聚合设计的优劣
 
 
7-2 日期问题面向对象设计(聚合一) 
 
 
  

 

        7-5 日期问题面向对象设计(聚合二)

 

 

 

 

    第一种是传统的类的方式,Year作为最底层的类,依次嵌套在Month,Day,DateUtil类中,通过一层层的调用,实现多个类的链接,此种聚合方式使得各个类链接紧密,但是在代码出现问题的时候,很难去发现问题出现在哪里,即使找到了bug,在修正bug的时候也有可能需要进行大量的代码修改。

    第二种聚合方式是将Year,Month,Day作为独立的聚合,由DateUtil类进行调用管理,这种方式比第一种方式更加简洁,当代码出现问题的时候,也能够准确定位错误的位置,对于代码的修改的复杂度也相对降低,更加便于我们对于类的操作。

 

  ②题目集4(7-3)、题目集6(7-5、7-6)三种渐进式图形继承设计的思路与技术运用
 
    PowerDesigner生成类图如下:
7-3 图形继承:类的继承与多态
 

 

 

        这道题主要是通过子类继承父类,并重写父类的方法,来完成计算各种不同图形的面积或体积,Circle,Rectangle他们都有共同的求图形面积的方法,继承Shape父类充分发挥了继承的优势,但是他们的方法又各不相同,通过改写父类的方法,他们各自在相同方法下又有了不同的表现,同时他们也分别作为Ball和Box的父类,子类重写他们的求面积的方法,使代码更加灵活简洁,具体父类和子类   情况如下
  1 class Shape{
  2     public void shape() {
  3         System.out.println("Constructing Shape");
  4     }
  5     public double getArea(){
  6         return 0.0;
  7     }//求图形面积
  8 }
  9 
 10 //继承自Shape
 11 class Circle extends Shape{
 12     private double radius;
 13     
 14     
 15     public double getRadius() {
 16         return radius;
 17     }
 18     
 19     public void setRadius(double radius) {
 20         this.radius=radius;
 21     } 
 22     
 23     public void Circle() {
 24         super.shape();
 25         System.out.println("Constructing Circle");
 26     }
 27     
 28     //重写父类继承来的求面积方法,求圆的面积
 29     public double getArea(){
 30         return  Math.PI*this.radius*this.radius;
 31     }
 32     
 33 }
 34 
 35 //继承自Shape
 36 class Rectangle extends Shape{
 37     private double width;
 38     private double length;
 39     
 40     public double getWidth() {
 41         return width;
 42     }
 43     
 44     public void setWidth(double width) {
 45         this.width=width;
 46     }
 47     
 48     public double getLength() {
 49         return length;
 50     }
 51     
 52     public void setLength(double length) {
 53         this.length=length;
 54     }
 55     
 56     public void Rectangle() {
 57         super.shape();
 58         System.out.println("Constructing Rectangle");
 59     }
 60     
 61     //重写父类继承来的求面积方法,求矩形的面积
 62     public double getArea(){
 63         return this.width*this.length;
 64     }
 65 }
 66 
 67 //继承自Circle
 68 class Ball extends Circle{
 69     
 70     public void Ball() {
 71         super.Circle();
 72         System.out.println("Constructing Ball");
 73     }
 74     
 75     //其属性从父类继承,重写父类求面积方法,求球表面积
 76     public double getArea(){
 77         return Math.PI*4*super.getRadius()*super.getRadius();
 78     }
 79     public double getVolume(){//求球体积
 80         return Math.PI*super.getRadius()*super.getRadius()*super.getRadius()*4/3;
 81     }
 82 }
 83 
 84 //继承自Rectangle
 85 class Box extends Rectangle{
 86     //从父类继承属性
 87     private double height;
 88     
 89     public double getHeight() {
 90         return height;
 91     }
 92     
 93     public void setHeight(double height) {
 94         this.height=height;
 95     }
 96     
 97     public void Box() {
 98         super.Rectangle();
 99         System.out.println("Constructing Box");
100     }
101     
102     //重写父类继承来的求面积方法,求立方体表面积
103     public double getArea(){
104         return this.height*super.getLength()*2+height*super.getWidth()*2+super.getArea()*2;
105     }
106     
107     public double getVolume(){//求立方体体积
108         return height*super.getArea();
109     }
110     
111 }

 

 

 

 
7-5 图形继承与多态
  

       这道题与上一题拥有相似的父类和子类,同样是子类继承父类,同时子类重写父类的方法,但是这一题与上一题不同的是,此时的Shape父类是一个抽象类,类里面也没有具体的方法,只有抽象的方法,子类继承抽象的方法并将抽象方法具体化,完成各自求面积和判断合法性的要求。

      抽象类是抽取其他类的一些共同的属性和方法,从而集成的类。抽象类和实体类的不同在于,抽象类是不能被实体化的,同时抽象类没有定义具体的方法,抽象类的子类必须重写父类的所有方法。抽象类就像是一种“标准格式”,子类都要按照“格式”来写内容,利用抽象类有利于方法的复用,并且在更加方便代码的拓展。

      此题的父类和子类如下:

 1 abstract class Shape{
 2     
 3     Shape (){
 4     }
 5     
 6     abstract public double getArea();
 7     abstract public boolean validate();
 8 }
 9 
10 class Circle extends Shape{
11     double radius;
12     
13     Circle(){
14     }
15 
16     Circle(double radius){
17         this.radius=radius;
18     }
19     
20      public double getArea(){
21         double s;
22         s=Math.PI*radius*radius;
23         return s;
24     }
25     
26     public boolean validate(){
27         if(radius>0)
28             return true;
29         else
30             return false;
31     }
32 }
33 
34 class Triangle extends Shape{
35     double side1;
36     double side2;
37     double side3;
38     
39     Triangle(){
40     }
41     
42     Triangle(double side1,double side2,double side3){
43         this.side1=side1;
44         this.side2=side2;
45         this.side3=side3;
46     }
47     
48     public boolean validate(){
49         
50         if(side1+side2<=side3||side1+side3<=side2||side2+side3<=side1)
51         {
52             return false;
53         }
54         if(side1-side2>=side3||side1-side3>=side2||side2-side3>=side1)
55         {
56             return false;
57         }
58         return true;
59     }
60     
61     
62     public double getArea(){
63         double p=(side1+side2+side3)/2;
64         double s=Math.sqrt(p*(p-side1)*(p-side2)*(p-side3));
65         return s;
66     }
67 }
68 
69 class Rectangle extends Shape{
70     double width;
71     double length;
72     
73     Rectangle(){
74     }
75     
76     Rectangle(double width,double length){
77         this.width=width;
78         this.length=length;
79     }
80     
81     public boolean validate(){
82         if(width>0&&length>0)
83             return true;
84         else
85             return false;
86     }
87     
88     public double getArea(){
89         double s;
90         s=width*length;
91         return s;
92     }
93 }

 

 

 
7-6 实现图形接口及多态性
  

    这道题又是一个上一道题的进阶,这道题运用了接口,接口和抽象类有很多相似的地方,比如:

    他们都不能实体化,他们的方法也都是抽象没有具体内容,要在子类中具体实现

    但是一个子类只能继承一个父类,子类可以继承多个接口

    当子类在继承了一个父类后,子类中仍然有一些方法无法实现,这个时候接口就能发挥作用了,

     接口更加有利于代码的拓展和多态

 
  ③三次题目集中用到的正则表达式技术的分析总结
      这三次题目集中的正则表达式,我完成的不是很好,主要是一开始在对正则表达式毫无认知的情况下,拿到一个并不简单的正则表达式的题目,一下子自己就有点懵了,对于题目就有                一种退却逃避的心态,认为自己根本做不到,如果将三次题目的顺序倒置,从简单一步步加大难度,循序渐进,我可能会做的更好,正则表达式的功能确实很实用,能准确快捷的筛选出我               们需要的信息,我还需要继续在正则表达式这方面下功夫。
 
  ④题目集5(7-4)中Java集合框架应用的分结总结
    这道题目是统计Java程序中关键词的出现次数,这道题目我并没有完成,因为涉及的知识点过多,再加上我正则表达式比较薄弱,所以并没有什么分析总结。
  
(3)踩坑心得
  1.在日期问题聚合一的题目的时候,由于属性私有,要通过函数调用,一开始没注意到这个,导致错误。
  2.在图形问题的时候,一开始对抽象类不够了解,抽象类的方法不知道怎么搞,后来在查询资料学习到。
  3.在日期问题的题目的时候,一直无法输出,然后通过在代码中增加System.out语句,一步步看到底是哪出问题了,具体问题不太记得了,但是最后终于是找到bug
(4)改进建议
  1.正则表达式的作业真的写的稀烂,这方面要多加练习.
  2.在网上查找资料的时候学习到ArrayList这种方法,可以将这种方法运用在自己的代码中。
  3.对于抽象类和接口还不够熟练,特别是接口,最近在接触到,在后续作业也好好运用。
  4.对于类的聚合问题,我还需要学习。
(5)总结
  通过这三次作业我学习到:
  1.正则表达式的一些方法,但是对于正则表达式还不够熟练。
  2.对于继承和多态有了更多更具体的了解,从书本走上了实践。
  3.学习到了抽象类和接口,以及他们的运用方法,同时了解到这两种的不同和优越性。
  4.发现了一些自己的不足的地方,希望在下次大作业中能自己能花更多实践去锻炼自己。
  在这三次的大作业中,涉及到的知识点很多,有一些甚至老师上课根本没怎么提及,这很考验我们的课后自学能力,这几次作业对于java的核心思想类和对象,我有了更深的体会,能够将C的面向过程的思想扭转过来,将一个问题用面向对象的思想去思考解决,要做什么类,负责什么职责等等。

 

 

 

 

 

 

 

 
posted @ 2021-11-13 23:54  阿松松松  阅读(51)  评论(0)    收藏  举报