OO题目集4~6总结

前言

第四次作业:

本次作业首次运用继承方法和正则表达式,正则表达式第一次接触就是在水文数据校验及管理,对于我来说有一点难度。以下为关于正则表达式和继承的一些知识点总结。

1)正则表达式:

正则表达式是由一些具有特殊含义的字符组成的字符串,多用于查找、替换符合规则的字符串。

关于使用正则表达式解决问题,可能需要使用到很多字母或特殊符号才能表示,查找符合题目要求的字符含义可能需要一定的时间,但是正则表达式在减少代码量以及改变代码的复杂度上起到了很大的作用。

具体问题遇到正则表达式的方法需要自行查阅。

2)继承:

继承是面向对象两大特征之一,继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。比如:圆是图形,圆拥有继承者的特性,同时也有自己的特性。通过使用继承我们能够更加方便地复用以前的代码,大大的提高开发的效率。

a.继承首先要满足“AB”的条件,则A可以继承BB为父类,A为子类。

b.除了那些private的外还有构造器是子类继承不了的。对于构造器而言,它只能够被调用,而不能被继承。 调用父类的构造方法使用super()。

c.对于protected而言,对于它指明的类用户相当于private,但是对于任何继承与此类的子类或者其他任何位于同一个包的类而言他可以访问。

第五次作业:

这次作业依旧写了关于面向对象日期问题,对于我而言,统计Java中关键字出现的次数难度最大,需要自己查询Java53个关键字并且通过List/Set/Map其中一种或者多种接口来实现。

1)Java中有两种形式可以实现多态:继承和接口。继承都是单继承,只能为一组相关的类提供一致的服务接口。但是接口可以是多继承多实现,它对于继承来说有更好的灵活性。

Map 初始化:Map<String, String> map = new HashMap<String, String>();

插入元素:map.put("key1", "value1");

获取元素:map.get("key1")

移除元素:map.remove("key1");

清空map:map.clear();

2)Java关键字是电脑语言里事先定义的,有特别意义的标识符、变量。他们用来表示一种数据类型或者表示程序的结构等,关键字不能用作变量名、方法名、类名、包名和参数。

第六次作业:

在水文数据校验及管理作业中是第一次接触到正则表达式,这道题本身也有一定的难度,可能没有很好的解决题目中所有的测试点,在第六次作业中,老师准备了四道有关运用正则表达式比较简单的题目,让我更好的运用正则表达式。本次作业依旧是练习正则表达式以及关于Java的封装、继承、多态的练习。

 

作业过程:

题目集4

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

设计与分析:

本次题目是想利用封装和继承,对题目的类图进行编写,实现求下n天、求前n天、求两个日期相差的天数,其中对于月份之内的日期求相差的天数,可以使用Period方法System.out.println(LocalDate.now().toEpochDay() - LocalDate.now().minusDays(5).toEpochDay());

踩坑心得:

题目要求是让设计四个类DateUtilYearMonthDay,但是只设计了一个DateUtil类,将yearmonthday都设计成了private,没有满足题目要求。在求下n天的时候,输入的最后日期不正确,最终测试点也没有通过,没有满分

 1 class DateUtil {
 2     private int year;
 3     private int month;
 4     private int day;
 5 
 6     public int getYear() {
 7         return year;
 8     }
 9 
10     public void setYear(int year) {
11         this.year = year;
12     }
13 
14     public int getMonth() {
15         return month;
16     }
17 
18     public void setMonth(int month) {
19         this.month = month;
20     }
21 
22     public int getDay() {
23         return day;
24     }
25 
26     public void setDay(int day) {
27         this.day = day;
28     }
29 
30     DateUtil(int year, int month, int day) {
31         super();
32         this.year = year;
33         this.month = month;
34         this.day = day;
35     }
36 
37     DateUtil() {
38 
39     }

 

改进建议:

这次关于求下N天的日期,修改了很久也没有通过测试点,输入1 1999 3 28 6543时,测试结果显示2017-2-25,但正确的应该为2017-2-24,希望找到漏洞,将程序最终修改正确。

 

题目集5

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

设计与分析:

这道题偷了个懒,用了题目集4关于日期问题面向对象设计(聚合一)的思路,没有使用新的思路。

踩坑心得:

这道题通过测试在求下N天依旧是输入1 1999 3 28 6543时,测试结果显示2017-2-25,但正确的应该为2017-2-24,但这道题测试点通过,通过debug还是没有找到问题所在。

 1 if (isLeapYear(date.year)) {// 闰年
 2                 if (leapYear[date.month - 1] == date.day) {// 月底
 3                     date.month++;
 4                     date.day = 1;
 5                     if (date.month == 13) {// 年底
 6                         date.year++;
 7                         date.month = 1;
 8                         date.day = 1;
 9                     }
10                 } else
11                     date.day++;
12             } else {
13                 if (noLeapYear[date.month - 1] == date.day) {// 月底
14                     date.month++;
15                     date.day = 1;
16                     if (date.month == 13) {// 年底
17                         date.year++;
18                         date.month = 1;
19                         date.day = 1;
20                     }
21                 } else
22                     date.day++;
23             }
24             return date;

改进建议:

关于日期类问题,求上N天或者下N天,N值较小时数据是准确的,当N过大时候,就出现了上述的情况。

 

7-4统计Java程序中关键词的出现次数

踩坑心得:

一开始这道题读题不够认真,理解错了题目的意思,以为是找出关键字的个数,直接输出一个数字即可,后面看到给出的输出样例发现并不是这样。除此之外,这道题需要注意的是,如果是注释里出现的关键字不需要统计关键字的数量。

编程的严谨性依旧是不容忽视的一个问题,Java53个关键字由于不够严谨,导致传入HashMap时多加了空白符导致出现bug,多次测试才找到最终问题所在。

 1 //写入代码
 2         while(!(str = input.nextLine()).equals("exit")) {
 3             list.add(str);
 4         }
 5         if(list.size() == 0)
 6             System.out.println("Wrong Format");
 7         //去掉注释
 8         ArrayList<String> newList = DealCode.filterNotes(list);
 9 
10         //判断
11         for(int n = 0; n < newList.size(); n ++) {
12             String[] array = DealCode.spiltString(newList.get(n));
13 
14             for(int m = 0; m < array.length; m ++) {
15                 DealCode.judge(map,array[m]);
16             }
17         }

判断关键字:

 //判断是否是关键字
    public static void judge(Map<String, Integer> map , String str) {
        if (map.get(str) != null) {
            int num = map.get(str);
            int m = num + 1;
            map.put(str, m);
        }
    }

改进建议:

这道题HashMapMapSet等接口都是首次接触,还不够理解和熟练,这道题也是通过别人讲解才能略懂一二,希望此类比较新颖的题目老师在今后可以讲解。

 

题目集4

7-3 图形继承

设计与分析:

对于类Circle、Rectangle继承类Shape,类Ball又继承类Circle,类Box继承类Rectangle,每个类的属性均为private,用到getter和setter方法。

对于四种合法输入:圆半径、矩形宽长、球半径、立方体宽长高,用switch解决。

踩坑心得:

注意输出为float类型

String str = String.format("Circle's area:%.2f", circle.getArea());

String str1 = String.format("Rectangle's area:%.2f", rectangle.getArea());

String str2 = String.format("Ball's surface area:%.2f", ball.getArea());

String str3 = String.format("Ball's volume:%.2f", ball.getVolume());

String str4 = String.format("Box's surface area:%.2f", box.getArea());

String str5 = String.format("Box's volume:%.2f", box.getVolume());

 

题目集6

7-5图形继承与多态

设计与分析:

多态简单的理解就是对象在不同情况下的不同表现,多态可以用“三个定义和两个方法”来总结。三个定义分别是父类定义子类构建、接口定义实现类构建和抽象类定义实体类构建,而两个方法分别是方法重载和方法重写。本次作业采用的是抽象类定义、实体类构建的方式。即 Shape 为抽象类,Circle、Rectangle 及 Triangle 为实体类。

 

 

class Triangle extends Shape

class Rectangle extends Shape

class Circle extends Shape

abstract class Shape implements Comparable<Shape>

 

关于泛型:

a.泛型作用: 限制加入集合中元素的类型,将类型限制为同一种类型。泛型在编译期间生效,不允许加入其他类型

b.定义泛型类的语法格式

类访问修饰符  class  泛型类名 <类型参数> {

类体

}

c.泛型接口的定义格式:

interface 接口名<类型参数列表>

{

...

}

d.在实现接口时,也应当声明与接口相同的类型参数:

class 类名<类型参数列表> implements 接口名<类型参数列表>

{

...

}

 1 class Triangle extends Shape{
 2     private double side1;
 3     private double side2;
 4     private double side3;
 5     public Triangle() {
 6     }
 7     public Triangle(double side1, double side2, double side3) {
 8         super();
 9         this.side1 = side1;
10         this.side2 = side2;
11         this.side3 = side3;
12     }
13     public double getSide1() {
14         return side1;
15     }
16     public void setSide1(double side1) {
17         this.side1 = side1;
18     }
19     public double getSide2() {
20         return side2;
21     }
22     public void setSide2(double side2) {
23         this.side2 = side2;
24     }
25     public double getSide3() {
26         return side3;
27     }
28     public void setSide3(double side3) {
29         this.side3 = side3;
30     }
31 
32     public double getArea() {
33         // TODO Auto-generated method stub
34         double p = (side1 + side2 + side3) / 2;
35         double area = Math.sqrt(p * (p - side1) * (p - side2) * (p - side3));
36         return area;
37     }
38 
39     public boolean validate() {
40         // TODO Auto-generated method stub
41         double[] side = {side1 , side2 , side3};
42         Arrays.sort(side);
43         if(side[0] > 0 && side[1] > 0 && side[2] > 0) {
44             if(side[0] + side[1] > side[2])
45                 return true;
46             else
47                 return false;
48         }else
49             return false;
50     }
51 
52 }

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

封装继承多态我认为是逐步递进的一个过程,多态的前提就是封装继承,有了这样的前提,我们可以进行方法的重载和重写 ,使得代码更加灵活简洁,可读性更强。

一个接口可以有多个直接父接口,但接口只能继承接口,不能继承类。

 

总结:

这三次作业主要是对于面向对象的三大特性:封装、继承、多态的题目练习,关于接口的题目练习,关于正则表达式的题目练习。

 面向对象程序设计的三大技术特性:封装,继承,多态。在作业过程中逐步加深了对这三个特性的理解,每一个类的设计都要求属性私有,同时设置私有属性的getter,setter,每一次题目中都能体会到封装性;图像继承的一系列题目中,父类子类由大到小,体会到了设计的继承性;在抽象类接口类中,子类重写父类的方法,更加灵活,体会到了多态性的实际运用。

接口可以理解为一种特殊的类,里面全部是由全局常量和公共的抽象方法所组成。因为Java不支持多继承,所以Java可以通过实现接口来弥补这个局限。 为了声明一个接口,我们使用interface这个关键字, 为了实现这个接口,我们使用implements关键词去实现接口。

关于使用正则表达式解决问题,可能需要使用到很多字母或特殊符号才能表示,查找符合题目要求的字符含义可能需要一定的时间,但是正则表达式在减少代码量以及改变代码的复杂度上起到了很大的作用。

这一周期的作业含金量很大,学到了很多面向对象的专业知识,但一部分首次接触难于理解,部分类型的题目对于我而言还是有一定的难度,希望在今后的学习中可以巩固之前所学的知识并且深入对面向对象编程的了解,做到温故而知新。

 

posted @ 2021-11-13 16:47  cuteli  阅读(405)  评论(0)    收藏  举报