第二次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)题目设计与分析
7-5 日期问题面向对象设计(聚合二)

第一种是传统的类的方式,Year作为最底层的类,依次嵌套在Month,Day,DateUtil类中,通过一层层的调用,实现多个类的链接,此种聚合方式使得各个类链接紧密,但是在代码出现问题的时候,很难去发现问题出现在哪里,即使找到了bug,在修正bug的时候也有可能需要进行大量的代码修改。
第二种聚合方式是将Year,Month,Day作为独立的聚合,由DateUtil类进行调用管理,这种方式比第一种方式更加简洁,当代码出现问题的时候,也能够准确定位错误的位置,对于代码的修改的复杂度也相对降低,更加便于我们对于类的操作。
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 }
这道题与上一题拥有相似的父类和子类,同样是子类继承父类,同时子类重写父类的方法,但是这一题与上一题不同的是,此时的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 }
这道题又是一个上一道题的进阶,这道题运用了接口,接口和抽象类有很多相似的地方,比如:
他们都不能实体化,他们的方法也都是抽象没有具体内容,要在子类中具体实现
但是一个子类只能继承一个父类,子类可以继承多个接口
当子类在继承了一个父类后,子类中仍然有一些方法无法实现,这个时候接口就能发挥作用了,
接口更加有利于代码的拓展和多态
浙公网安备 33010602011771号