一、前言
- 知识点
①this:
1)属性访问:访问本类中的属性,如果本类中没有此属性,则从父类中继续查找。
2)方法:访问本类中的方法,如果本类中没有此方法,则从父类中继续查找。
3)调用构造:调用本类构造,必须放在构造方法的首行。
4)首行:表示当前对象。
②super:
1)属性访问:访问父类中的属性。
2)方法:直接访问父类中的方法。
3)调用构造:调用父类构造,必须放在子类构造方法的首行。
③super和this的区别:
1)代表的实物不同:
super代表的是父类空间的引用。
this代表的是所属函数的调用者对象。
2)使用前提不同:
super必须要有继承关系才能使用。
this不需要继承关系也能使用。
3)调用的构造函数不同:
super:调用父类的构造函数。
this:调用所属类的构造函数。
示例:
super可以用来直接引用父类的实例变量。eg:super.name;
super可以用来直接调用父类的方法。eg.super.get();
super()可以用于直接调用父类构造的函数。eg:super();
④理解面向对象的封装性、继承性与多态性三大技术特性
⑤面向对象设计的基本原则理解(单一职责原则及“开-闭”原则)
单一职责原则:一个类只做一件事情,并且专注于这件事。如果需求发生改变,只需要对对象对应的类做出改变,对其他功能不会产生影响,这就实现了功能的单一。
“开-闭”原则:对于扩展是开放的,可实现新功能的添加。对于更改是封闭的,不能更改原本的功能。抽象方法封闭起来。开放继承可扩展。
- 题量和难度
- 第四次题目集虽然只有三题,但因为前两题难度对我来说有点大,最后在截止时间前也没有对代码更好的完善;
- 第五次题目集一共四题,后面两题都比较简单较快能写出,第一题日期问题面向对象设计有一部分都可延用上一次题目集的,第二题就有点难度
- 第六次题目集一共六题,前四题都是正则表达式训练,因为在之前的pta就对正则表达式有一些了解了,举一反三较快就完成了。主要是第五题花了大量时间,也是我认为本次题目集最难的一题。
二、设计与分析
①题目集4(7-2)、题目集5(7-5)两种日期类聚合设计的优劣比较
- 题目集4(7-2)
- 题目集5(7-5)
两种聚合设计方式不同,题目集4(7-2)中的聚合方式就像一个链条,一个类连着一个类,看上去每个类的独立性不高,年月日这三个类由于都有公共属性,所以在定义了年year中的value属性之后,在月这个类就中要加上Day型的day属性,在日这个类中Mongth型的month属性和Day型的day属性,由此在DateUtil类的方法中想要调用年月日这三个类中的方法时就得使借用月和日中的属性来完成,这样做可能会导致程序的执行效率不高,类和类之间的关联性较强,不太利于程序的复用。
②题目集4(7-3)、题目集6(7-5、7-6)三种渐进式图形继承设计的思路与技术运用(封装、继承、多态、接口等)
第一次题目中,是将Shape
设计为抽象的父类,而其他为子类,通过子类继承父类的getArea()
抽象函数计算面积,但是没有在父类中设计计算体积的抽象函数,因为有部分子类不需要该方法,这里主要的技术是继承和方法对的多态,并且在部分子类中添加了子类独有的计算体积对的方法
第二次题目中,同样的设计了一个Shape
的父类里面带有三个抽象类,子类通过继承父类,来校验数据的合法性和对面积的计算,技术也是继承和方法的多态,但是对多数据的处理,采用了List
将其泛型Shape
利用类的多态进行存储。
第三次题目集,利用了接口技术,让三个图形类可以使用接口的抽象函数,进行计算。
③对三次题目集中用到的正则表达式技术的分析总结
1.掌握对于字符串处理的方式
1 StringBuilder hydrologicData = new StringBuilder();
通过,这个类将字符串进行添加划分,达到处理字符串的目的,具体的方法为:str.append();这个具体的方法在,习题集四处理水文数据中用到了。
2.划分字符串的方法
1 String[] a = data.split("\n");
通过这一方法,我们可以将我们要处理的水文数据转化为字符串数组,达到分组处理的目的;
3.pattern和matcher的匹配合法字符串的技术
Pattern sort = Pattern.compile("((([1-9]{1}|[1-9][0-9]{1}|[1-9][0-9]{2}|[1-9][0-9]{3})/((([13578]|1[02])/([1-9]|[12][0-9]|3[01]))|(([469]|11)/([1-9]|[12][0-9]|30))|(2/([1-9]|[1][0-9]|2[0-8]))))|((([1-9]{0,1}[0-9]{0,1})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))/2/29)) ([02468]|1[02468]|2[02]):00"); if( sort.matcher(str).matches()) return true; return false;
通过这一方法我们可以匹配到,合法的水文数据,从而进行判断,我们输入的水文数据的合法性,主要用于我们输入正确的正则表达式,进行正确的校验。
4.将字符串转化为整形数,用于,水文数据的运算;
1 int year =Integer.valueOf(yearAndMonthAndDay[0]); 2 int month =Integer.valueOf(yearAndMonthAndDay[1]); 3 int day =Integer.valueOf(yearAndMonthAndDay[2]); 4 int minute =Integer.valueOf(minuteAndsecond[0]); 5 int second =Integer.valueOf(minuteAndsecond[1]);
Integer. valueOf()可以将基本类型int转换为包装类型Integer,将字符串型转化为整形,方便了我们的运算。
5.替换字符串中的内容
1 cs= cs.replaceAll("[^a-zA-Z]", " ");
运用这个方法可以将字符串中,我们不需要的内容,或者是无用的内容,替换为,我们想要使其成为的内容,从而更好的处理字符串。
6.习题集六的一些简单的正则表达式设计
1 String rule = "[1-9]?[1-9]?[1-9]?[A-Za-z]"; 2 String rule = "[1-9][0-9]{4,14}";
3
总结:通过三次习题集的正则表达式练习题,使我们对于正则表达式有了更深入的了解,提高了我们对于字符串处理的能力,正则表达式,就是们设定的一种关于字数串是否合理的一些表达式,用他们就可以检验出,我们输入的数据是不是合法,如果合法再进行进一步的处理,另外在这次题目中也渗透了一些关于字符串处理的方法,比如字符串数组的划分等等,都提高了我对于字符串的处理能力。
④题目集5(7-4)中Java集合框架应用的分析总结
1.本次题目涉及到的集合框架
1 Map<String, Integer> map1=new HashMap<String, Integer>();
该接口中所包含有三个方法
get方法:获取指定键(key)所对应的值(value);
put方法:将指定的键与值对应起来,并添加到集合中;
remove方法:根据指定的键(key)删除元素,返回被删除元素的值(value)
1 Set set=map1.keySet();
获取所有键值对对象的集合
set 遍历输出想要的键与对应的值
1 Arrays.sort(String); 2 for(Object num:String){ 3 System.out.println(map1.get(num)+"\t"+num); 4 }
2.使用集合框架的好处
1.我认为集合框架,很方便的帮助我处理了数据,在编程时提供了很多的便利,可以对我们进行储存的数据,进行很好的查阅和修改,方便了我们对数据的处理。
2.集合框架中的一些遍历的方法,都极大的减少了我们代码的圈复杂度,使我们的代码看上去简洁的同时,又实现了功能.
3.集合框架真的很方便。
4.集合框架相对于数组,我认为,数组只要确定了,他的长度也确定了,二而集合框架是一个动态的长度,根据我们的需要往里面添加数据。
5.我认为集合框架一定程度上也简化了我们的代码,不论是遍历,还是插入等,比起我们用数组for循环遍历好了许多。
总结:我认为集合框架带给了我们许多好处,在今后的学习中,我仍然需要去掌握关于Java 学习框架的使用,这些接口都是C语言所没有的,也是面向对象带给我们的好处,这些方法都优于我们平时所用的数组,遍历也优于我们平时的for循环遍历,关于Java一些较好且较为便利的功能仍然需要我去进一步的学习。
三、采坑心得
- 题目7-2
这个题主要的问题在于功能方法上出现的小问题:
- 首先在实现比较两个日期大小的时候,只考虑到了年份相比较,忘记了年份相等时的问题,于是改正:
else if (day.getMonth().getYear().getValue() == date.getDay().getMonth().getYear().getValue()){ if (day.getMonth().getValue() > date.getDay().getMonth().getValue()) { return true; } else if (day.getMonth().getValue() == date.getDay().getMonth().getValue()) { return day.getValue() > date.getDay().getValue(); } else return false; }
-
在求日期的下n天的功能实现上,由于要将原有日期的基础上加n,测试时会导致整形数据越界,导致错误,所以这里的
int days
需要改成long days
防止数据溢出。 -
如果判断前一个日期比后一个日期大,本来我进行的操作是根据不同的情况做不同的操作,增加了许多代码,最后变量太多导致我自己都晕了,于是想到为什么不交换日期。删除了一些冗余的代码,增加了一个交换日期的代码;在最开始的时候我还发现原本的方法不能直接这道题,因为这样做输入的数据就会被覆盖,需要增加变量来保存原来的数据。
-
还有一个小问题就是存储每个月份的最大天数使用的是数组,而月份是从1开始,所以索引的时候需要-1。
四、改进建议
图形继承,该题父类功能太单一,仅仅是一个求面积的方法,子类只有和父类相同的功能时,才能实现对应功能。在这种情况下可能使用类的接口时会更好一些,接口在符合规则的前提下,其他的功能子类都可调用到接口中同名的功能方法,接口中的抽象方法都得以实现,且多个无关的类可以实现同一个接口,一个类可以实现多个无关的接口。因为接口的属性和抽象方法默认是必须公开的所以如果有需要保护私有的的属性或者方法时,必须用继承一个类。
五、总结
- 在类设计的基础上,通过对继承,多态,接口等多方面学习,认识到类设计不是单一的去设计一个方法完成功能。面向对象编程的思想,也在本次学习真正拉开了序幕。面向对象编程不同于面向过程编程,在创立一个对象后便有明确的功能性,通过继承,多态,接口可以实现不同对象实现不同的功能。其中在类设计上,通过学习类属性的访问权限,初步了解了四种访问权限:public,private,protected,default;以及不同类的类型:实体类,业务类,接口类;对于类设计上,学习的多,代表思路与编程思想变得更为开阔且严谨,开始真正考虑到如何将一个题目设计到恰如其分,其中日期的聚合题目让我深入的感受到,不同的设计思路带来的不同效果。
- 本次阶段性学习主要学习到了类的创建,使用,继承,多态,接口,对于类的创建以及使用继承来说接受比较容易,但接口和多态的使用还是不够成熟,虽然知道其用法以及其特点,同时对字符串使用,排序等等也比较熟练,当然在总结过程中不能忘了最关键的正则表达式,其使用范围很广但同时也存在一定难度,简单的使用还不成问题,如果还想进阶的话还需要再花一些工夫。
- 对面向对象三大技术特性之间关系的理解
- 封装性:封装就类似于设置了一个保护罩,在外界请求访问时进行管控,可以加强安全性;
- 继承性:继承使得子类对象拥有父类对象的属性和方法,也可以重写方法,通过这样的特性可以使对象之间的关系更明了并且不用重复写同样的代码,避免了代码臃肿,并且当我们需要更改这些相同的代码时使用继承关系会使工作量大大减少;
- 多态性:使一个行为可以进行不同的操作,带来不同的结果,运用多态使方法更灵活、更简单。