面向对象第三次博客作业
前言:
这个学期的课程已经接近尾声,面向对象的学习内容也越来越深入,从最开始的只要写不到50行的代码到现在需要写六七百行的代码,我能真真切切的感受到自己学会了很多东西。Java作为现代编程的主流语言之一,其身上有许多独特的魅力值得我们去探索。而pta这个平台就给我们提供了非常好的训练平台,而老师也在pta上布置了一些非常经典的提目,难度也较上三次作业有比较大的提升。
关于三次作业
这三次作业的难度较上三次有比较大的提高,而且题目量也有较大提高。主要是提高我们对多态,接口,继承的使用。老师也稍微降低了提高难度的速度,让我们有更多时间去学习和准备这门课程。这三次题目集最经典的就是ATM类结构设计(一)和ATM类结构设计(二)这两道题目非常相似,不过在ATM类结构设计二中添加了跨行取款功能以及信用卡透支消费功能。在这三次的题目集中我们开始慢慢接触到了java的核心部分了,多态作为java最核心的部分,能有效的保证代码的可重复利用性,以及方便维护。所以学好多态是学好java的必要条件。
三次作业的主要知识点
题目集7:本题目集有2道题,第二题为第一题的延伸,本次题目集主要实验了创建类,创建抽象类,使用接口,类的继承和聚合,以及类于类之间方法的调用,题目集都是与图形继承有关,主要是想让我们掌 握类的继承、多态性使用方法以及接口的应用。图形的继承是一个非常典型的例子,可以让我们很好的理解多态与继承。在图形类的设计中,体会到了面向对象设计原则中的“开-闭”原则的实现方法及其作用。 本题目集老师还让我们学习了有关Compareable接口的应用,并且重写接口中的CompareTo的方法,这是一个很常用几乎所有的类都有的方法,CompareTo方法可以帮助我们实现很多功能,例如比较该类属性的大小。
题目集8:本题目集为一道题,但是题目还是很难的,需要注意很多细节。本题主要的知识点为类的创建类的使用,类中函数的调用和类的继承和聚合,在这次Pta作业中老师并没有给我们类图,需要我们去了解关于atm机,银行,以及银行卡,账户之间的关系,如果没有搞明白他们之间有什么关系的话,硬着头皮写的话要很久才能写出来一点,还是没有结构的那种。其实在一开始设计类间关系时,有很多地方是不符合类设计原则的,在一次次修改代码后,终于明白了如何设计才能符合类设计原则。其实本题目集要实现的功能是非常简单的,主要就是考查我们是否理解并掌握类设计的七大基本原则。
题目集9:本题目集为一题,是题目集8的升级版。这次题目集老师给了第八次题目集的源码,在这道题目集上优化升级,比如封装跨行取款的手续费,以及支持信用卡透支消费。因此我们要多几个类,我在进行类设计时,将卡类设计成为了虚拟类,账户类也成为了虚拟类,卡类和账户类都有俩个子类。这是根据类的开闭原则来做的。除此以外,我还设计了工具类。
设计与分析
1. 7-1 图形卡片排序游戏
这道题目我觉得就是对于comparable接口以及compareto()方法的应用,对于Comparable 接口的应用 图形类设计参考了作业 6-1 的类层次结构,此次作业要求对卡片排序时使用 Comparable 接口, 即 Card 类需要实现 Comparable 接口中的 CompareTo()方法。做这道题首先要能够迅速求出各卡片的面积大小,然后根据comparable接口以及compareto()方法将卡片按照其面积值从大到小进行排序,同时求出所有卡片的面积之和,这就是本道题的全部思路。做这道题目时要深刻的了解comparable接口以及compareto()方法之间的关系,Comparable可以认为是一个内比较器,实现了Comparable接口的类有一个特点,就是这些类是可以和自己比较的,至于具体和另一个实现了Comparable接口的类如何比较,则依赖compareTo方法的实现,compareTo方法也被称为自然比较方法。如果开发者add进入一个Collection的对象想要Collections的sort方法帮你自动进行排序的话,那么这个对象必须实现Comparable接口。compareTo方法的返回值是int,有三种情况:1、比较者大于被比较者(也就是compareTo方法里面的对象),那么返回正整数 2、比较者等于被比较者,那么返回0 3、比较者小于被比较者,那么返回负整数,根据我们设置的比较器,我们就能很快的得出我们所需要的排序。


这次题目集的复杂度来源就是排序时的for循环。
2. 7-2 图形卡片排序游戏
本道题基本上与上一题吻合,其实就是对上一题的迭代过程只是我们将它分了组,然后进行排序等操作,关于这个分组,我对此进行的就是重新创建储存的动态数组,每组一个:
ArrayList<Card> cardList=new ArrayList<Card>();
ArrayList<Card> cardList1=new ArrayList<Card>();
ArrayList<Card> cardList2=new ArrayList<Card>();
ArrayList<Card> cardList3=new ArrayList<Card>();
ArrayList<Card> cardList4=new ArrayList<Card>();
将原有dealcardlist中cardlist属性创建为四个,首个为储存整个的数据,其他的三个分别为各个形状分类储存。每当在其判断形状之后,如果是圆形,则加到cardlist1中,如果是矩形加到cardlist2中……其他形状也是如此。在排序的时候我只是在7-1的基础上加了大括号,输出的格式变了一下,还有就是其各个形状的排序,我只是分开排序 而已。这道题与上道题相比只是输出的格式的改变以及对排序的方法的应用。


3. ATM(一)


4. ATM(二)


采坑心得
1 . 在写题目集九的时候我没有注意到,关于贷款的利息和金额是怎么计算的,在经过我很多次的计算以后我才知道,当账户内还有余额是取钱是不需要收卡内余额的费用的。代码如下
if(account1 != null) { if(account.getBalance()>0) { if(amount>account.getBalance()) { Servicecharge2 = (amount-account.getBalance()) * 0.05 ; } } if(account.getBalance()<0) { Servicecharge2 = (amount) * 0.05 ; } if(amount+Servicecharge1 > account.getBalance()+account1.getCreditbalance()) { System.out.println("Sorry,your account balance is insufficient."); System.exit(0); } }
改进建议
1.在题目集七的输出方法中可以更简便的输出,但是我用了最复杂的方法代码如下
public void showResult(){ System.out.println("The original list:"); if(cardList.size()!=0) { System.out.print("[") ; for (Card card : cardList) { System.out.print(card.getShape()); } System.out.print("]") ; } System.out.println() ; System.out.println("The Separated List:") ; System.out.print("[") ; for (Card card : cardList1) { System.out.print(card.getShape()); } System.out.print("]") ; System.out.print("[") ; for (Card card : cardList2) { System.out.print(card.getShape()); } System.out.print("]") ; System.out.print("[") ; for (Card card : cardList3) { System.out.print(card.getShape()); } System.out.print("]") ; System.out.print("[") ; for (Card card : cardList4) { System.out.print(card.getShape()); } System.out.print("]") ; System.out.println(); System.out.println("The Separated sorted List:"); System.out.print("[") ; cardSort1(); System.out.print("]") ; System.out.print("[") ; cardSort2(); System.out.print("]") ; System.out.print("[") ; cardSort3(); System.out.print("]") ; System.out.print("[") ; cardSort4(); System.out.print("]") ; System.out.println(); System.out.printf("The max area:%.2f\n",getAllArea()); } }
从代码中可以看出我是直接输出的,没有用循环做,我感觉可以做一个方法。
2.在第八和第九次题目集中,很多题目我都使用了简单而传统的for语句,后面通过学习对比发现,这种最简单的for语句在遍历数据时耗时比较长,就目前我所学会的几种遍历方式中,增强for语句的耗时比较短,以后尽量使用增强for语句,同样,在不同的代码中也要改变相应的方法,在ArrayList中用for,在LinkedList中用迭代器Iterator。
总结
通过本次题目集的学习,我还了解到了接口,前面也提到过,接口相当于一个完全抽象的抽象类,其中有抽象方法,而接口和抽象类一个重要的区别就是接口中只有抽象方法和常量,但接口可以进行多继承,这是两者的区别,使用接口可以提高代码的可维护性和扩展性,且接口可以减少代码的书写,学会使用接口对我们专业的学习非常有帮助。我现在还只了解接口的大概,还需要进一步地去学习接口。经过这三次题目集的训练,学到了很多,最开心的就是了解到了多态是一个怎么样的东西,多态是打开java这门课程的钥匙,只有学到多态才可能学到java这门课程的精髓。 除了多态我还了解到了渐进式图形继承设计的思路与技术运用(封装、继承、多态、接口等)。 封装是大部分类都需要用的一个技术,有了封装客户的数据,才能受到安全的保护,而继承则可以很好的为我们减少代码的重复,增加代码的可读性和精简。 我认为对于多态方面我还是需要多多加强训练。 以及加强逻辑思维的能力,能够实现类的关系设计。

浙公网安备 33010602011771号