0.前言
本次博客是关于阶段性java作业(第四次,第五次,第六次大作业)的总结
1.作业过程总结
①第四次作业是关于简单的继承,蒙特卡罗方法求圆周率和水文数据处理;第五次作业是关于图形继承与多态和一元多项式求导;第六次作业是关于图形卡片排序,分组问题(涉及类的继承,多态和接口的应用),还有一道加分题--求素数的算法优化设计。关于这三次作业的知识得迭代情况--主要是考察类的继承,在类的继承得基础上加大难度,比如:对正则表达式的运用,对接口的运用,对优化算法设计的应用。
②通过作业逐步理解面向对象的封装性、继承性与多态性三大技术特性以及对面向对象三大技术特性之间关系的理解
封装:在面向对象的使用过程中经常用到,某些成员禁止的对象的外部进行访问,这种情况下需要对成员进行封装.常用的关键字private。成员属性私有化:private $sex=’值’;成员方法的私有化:private function 方法名()
私有化特征:1.一旦某个成员被私有化(private),那么在对象的外部不能够被修改和访问。2.私有化成员在对象的内部可以使用$this 进行访问。3.声明关键字private 不能够和var 关键字同时使用。在作业中的每个类里都用私有属性,如在class Circle中定义:private double radius
继承的特性:
在面向对象的开发过程中,2个类之间可能存在代码大部分重复的情况,为了解决这种问题,引入继承概念,一个类继承另一个类之后就具备该类的所有成员。父类:被其他类继承的类称之为父类。子类:继承其他类的类成为子类,也叫做派生类。继承的实现方式:class 子类名 extends 父类名。如在这几次作业中,图形继承,先有class shape,然后又有cirle类,就可以用继承class circle extends shape,并在circle类里使用super()方法,继承父类的属性。但在类中具有继承关系的类,子类中可以重载父类中的方法。
多态的特性:对象根据所接收的消息而做出动作。同一消息被不同的对象接受时可产生完全不同的行动,这种现象称为多态性。
③在Java作业中难免会遇到各种各样的问题,如:水文数据处理和一元多项式求导中,需要用到正则表达式,然而我对于正则表达式不是很掌握,所以会查阅资料(看Java菜鸟教程中的正则表达式。附上链接:https://www.runoob.com/java/java-regular-expressions.html)还有一些关于继承的使用,会向同学请教,对于第六次作业接口的问题,属实没弄懂,所以在作业中没有使用接口的方法。
三次作业花费时间比例:每次作业大概都需要三个小时左右
2.OO设计心得
①面向对象设计的基本原则理解(单一职责原则及“开-闭”原则)
单一职责原则:一个对象应该只包含单一的职责,并且该职责被完整地封装在一个类中。 类的职责要单一,不能将太多的职责放在一个类中,不能使一个类太累。单一职责原则是实现高内聚、低耦合的指导方针。我觉得这是面向对象设计的一种魅力,代码看起来很舒服,改bug也很容易。
1 import java.util.Scanner; 2 public class Main { 3 public static void main (String [] args){ 4 Scanner input=new Scanner(System.in); 5 String b[]=new String[1000];//类型 6 double c[]=new double[1000];//面积 7 String name[]=new String[1000]; 8 int a[]=new int[100],length=0,flag=1; 9 double sum1=0,sum2=0,sum3=0,sum4=0,max; 10 int num = input.nextInt(); 11 while(num==0) 12 { 13 System.out.println("Wrong Format"); 14 System.exit(0); 15 } 16 while(num != 0) 17 { 18 19 if(num <=0 || num > 4) 20 { 21 System.out.println("Wrong Format"); 22 System.exit(0); 23 } 24 a[length]=num; 25 num = input.nextInt(); 26 length++;//总共输入length个有效; 27 } 28 for(int j=0;j<length;j++) { 29 if(a[j]==0) 30 { 31 flag=1; 32 System.out.println("Wrong Format"); 33 } 34 if(a[j]==1) { 35 double r=input.nextDouble(); 36 Circle circle=new Circle(r); 37 if(circle.validate()){ 38 flag=1; 39 b[j]= "Circle"; 40 c[j]=circle.getArea(); 41 } 42 } 43 if(a[j]==2){ 44 double l=input.nextDouble(); 45 double w=input.nextDouble(); 46 Rectangle rectangle=new Rectangle(l,w); 47 if(rectangle.validate()){ 48 flag=1; 49 b[j]= "Rectangle"; 50 c[j]=rectangle.getArea(); 51 } 52 } 53 if(a[j]==3){ 54 double s1=input.nextDouble(); 55 double s2=input.nextDouble(); 56 double s3=input.nextDouble(); 57 Triangle triangle = new Triangle(s1,s2,s3); 58 if(triangle.validate()){ 59 flag=1; 60 b[j]= "Triangle"; 61 c[j]=triangle.getArea(); 62 } 63 } 64 if(a[j]==4) { 65 double t=input.nextDouble(); 66 double bot=input.nextDouble(); 67 double h=input.nextDouble(); 68 Trapezoid trapezoid = new Trapezoid(t,bot,h); 69 if(trapezoid.validate()){ 70 flag=1; 71 b[j]="Trapezoid"; 72 c[j]=trapezoid.getArea(); 73 } 74 } 75 } 76 if(flag==0) 77 System.out.println("Wrong Format"); 78 if(flag==1){ 79 System.out.println("The original list:"); 80 System.out.print("["); 81 for(int j=0;j<length;j++) { 82 System.out.printf(b[j]+":"+String.format("%.2f",c[j])+" "); 83 } 84 System.out.print("]"); 85 86 System.out.println(" The Separated List:"); 87 System.out.print("["); 88 for(int j=0;j<length;j++) 89 { 90 if(a[j]==1) 91 System.out.print(b[j]+":"+String.format("%.2f",c[j])+" "); 92 } 93 System.out.print("]"); 94 95 System.out.print("["); 96 for(int j=0;j<length;j++) 97 { 98 if(a[j]==2) 99 System.out.print(b[j]+":"+String.format("%.2f",c[j])+" "); 100 } 101 System.out.print("]"); 102 103 System.out.print("["); 104 for(int j=0;j<length;j++) 105 { 106 if(a[j]==3) 107 System.out.print(b[j]+":"+String.format("%.2f",c[j])+" "); 108 } 109 System.out.print("]"); 110 111 System.out.print("["); 112 for(int j=0;j<length;j++) 113 { 114 if(a[j]==4) 115 System.out.print(b[j]+":"+String.format("%.2f",c[j])+" "); 116 } 117 System.out.print("]"); 118 119 for(int i=0;i<length;i++) 120 { 121 for(int j=0;j<length-1-i;j++) 122 { 123 124 125 if(c[j]<c[j+1]) 126 { 127 double temp=c[j]; 128 c[j]=c[j+1]; 129 c[j+1]=temp; 130 String s=b[j]; 131 b[j]=b[j+1]; 132 b[j+1]=s; 133 } 134 135 } 136 } 137 System.out.println(" The Separated sorted List:"); 138 System.out.print("["); 139 for(int j=0;j<length;j++) 140 { 141 if(a[j]==1) 142 System.out.print(b[j]+":"+String.format("%.2f",c[j])+" "); 143 } 144 System.out.print("]"); 145 System.out.print("["); 146 for(int j=0;j<length;j++) 147 { 148 if(a[j]==2) 149 System.out.print(b[j]+":"+String.format("%.2f",c[j])+" "); 150 } 151 System.out.print("]"); 152 System.out.print("["); 153 for(int j=0;j<length;j++) 154 { 155 if(a[j]==3) 156 System.out.print(b[j]+":"+String.format("%.2f",c[j])+" "); 157 } 158 System.out.print("]"); 159 System.out.print("["); 160 for(int j=0;j<length;j++) 161 { 162 if(a[j]==4) 163 System.out.print(b[j]+":"+String.format("%.2f",c[j])+" "); 164 } 165 System.out.print("]"); 166 167 168 169 170 for(int j=0;j<length;j++) 171 { 172 if(a[j]==1) 173 { 174 sum1+=c[j]; 175 } 176 if(a[j]==2) 177 { 178 sum2+=c[j]; 179 } 180 if(a[j]==3) 181 { 182 sum3+=c[j]; 183 } 184 if(a[j]==4) 185 { 186 sum4+=c[j]; 187 } 188 } 189 max=sum1; 190 if(sum2>max) 191 max=sum2; 192 if(sum3>max) 193 max=sum3; 194 if(sum4>max) 195 max=sum4; 196 System.out.println(" The max area:"+String.format("%.2f",max)); 197 } 198 } 199 } 200 abstract class Shape{ 201 public abstract double getArea(); 202 public abstract boolean validate(); 203 public abstract String toString (); 204 } 205 class Circle extends Shape{ 206 private double radius; 207 public Circle(){ 208 209 } 210 public Circle(double radius){ 211 setRadius(radius); 212 } 213 public void setRadius(double radius){ 214 this.radius=radius; 215 } 216 public double getRadius(){ 217 return this.radius; 218 } 219 @Override 220 public double getArea(){ 221 return Math.PI*radius*radius; 222 } 223 @Override 224 public boolean validate(){ 225 if(radius>0) 226 return true; 227 else 228 return false; 229 } 230 @Override 231 public String toString(){ 232 return null; 233 } 234 } 235 236 237 class Rectangle extends Shape{ 238 private double length,width; 239 public Rectangle(){ 240 241 } 242 public Rectangle(double length,double width){ 243 setLength(length); 244 setWidth(width); 245 } 246 public void setWidth(double width){ 247 this.width=width; 248 } 249 public double getWidth(){ 250 return this.width; 251 } 252 public void setLength(double length){ 253 this.length=length; 254 } 255 public double getLength(){ 256 return this.length; 257 } 258 @Override 259 public double getArea(){ 260 return length*width; 261 } 262 @Override 263 public boolean validate(){ 264 if(length>0&&width>0) 265 return true; 266 else 267 return false; 268 } 269 @Override 270 public String toString(){ 271 return null; 272 } 273 } 274 class Triangle extends Shape{ 275 private double side1,side2,side3; 276 public Triangle(){ 277 278 } 279 public Triangle(double side1,double side2,double side3){ 280 setSide1(side1); 281 setSide2(side2); 282 setSide3(side3); 283 } 284 public void setSide1(double side1){ 285 this.side1=side1; 286 } 287 public double getSide1(){ 288 return this.side1; 289 } 290 public void setSide2(double side2){ 291 this.side2=side2; 292 } 293 public double getSide2(){ 294 return this.side2; 295 } 296 public void setSide3(double side3){ 297 this.side3=side3; 298 } 299 public double getSide3(){ 300 return this.side3; 301 } 302 @Override 303 public double getArea(){ 304 double l=(side1+side2+side3)/2; 305 return Math.sqrt(l*(l-side1)*(l-side2)*(l-side3)); 306 } 307 @Override 308 public boolean validate(){ 309 if(side1+side2>side3&&side1+side3>side2&&side2+side3>side1) 310 return true; 311 else 312 return false; 313 } 314 @Override 315 public String toString(){ 316 return null; 317 } 318 } 319 class Trapezoid extends Shape{ 320 private double topSide,bottomSide,height; 321 public Trapezoid(){ 322 323 } 324 public Trapezoid(double topSide,double bottomSide,double height){ 325 setTopSide(topSide); 326 setBottomSide(bottomSide); 327 setHeight(height); 328 } 329 public void setTopSide(double topSide){ 330 this.topSide=topSide; 331 } 332 public double getTopSide(){ 333 return this.topSide; 334 } 335 public void setBottomSide(double bottomSide){ 336 this.bottomSide=bottomSide; 337 } 338 public double getBottomSide(){ 339 return this.bottomSide; 340 } 341 public void setHeight(double height){ 342 this.height=height; 343 } 344 public double getHeight(){ 345 return this.height; 346 } 347 @Override 348 public double getArea(){ 349 return (topSide+bottomSide)*height/2; 350 } 351 @Override 352 public boolean validate(){ 353 if(topSide>0&&bottomSide>0&&height>0) 354 return true; 355 else 356 return false; 357 } 358 @Override 359 public String toString(){ 360 return null; 361 } 362 }
注:这就是我不会用接口,然后导致Main类太复杂,改BUG改半天改不出的后果,哭了哭了。。
开-闭原则:开-闭原则则是对于扩展是开放的,对于修改是关闭的。开闭原则是面向对象的可复用设计的第一块基石,是面向对象设计的目标。
我看过一篇博客,对这两个原则分析的很到位,在此附上链接(https://blog.csdn.net/iteye_568/article/details/82610391)
②OO编程思维的理解(Object oriented)
面向对象将事物都看成对象,将具有相同特征的实物看作类。通过对类与对象的继承,封装,多态的实现,完成模拟现实从而解决问题。
③类设计心得
设计类要根据题目的要求,再用继承,封装,多态,接口等方法实现类,注意不要再一个类里放太多的方法,不然可能会使程序出现问题。
3.测试的理解与实践
①代码质量保证了,功能才能稳定,稳定可靠的功能就是最好的宣传。保证代码质量就是程序员练内功,内功扎实,才能在上面构建更多的可能性。但往往在平时作业中可能我们的代码都是有漏洞的,但pta开发环境可能检测不到我们的漏洞,所以在平时写代码的时候,需要严谨的思考。对此,建议大家可以看看有关测试方面的书籍--譬如《谷歌测试之道》,《微软测试之道》,《持续交付》,《测试驱动开发》,《自动化测试》。
②用Junit也可以对程序进行测试(链接:https://blog.csdn.net/qq_42618969/article/details/81082382)
4.课程收获
最大的收获当然是又学到了更多的关于Java的新知识,虽然有些地方还没有完全搞懂,但我会慢慢消化,学好OO设计编程。当然,在收获的同时当然也会又教训,比较大的教训可能就是对Java类理解的不够到位,导致在每次大作业的时候都需要请教同学某个类里的某个方法到底起什么作用。
5.对课程的建议
还是老话,希望老师每次能把上课讲得实例代码发出来,对于我这种啥都不会的小白可是有很好的作用的。