前言:
第三阶段的这三次作业,从题目看题量明显减少,但代码量相对增加,作业难度也有所增加,同时对于Java语言的运用也更加详细,对代码的重构,代码的设计,代码的复用性都得到了更好的理解和掌握。
第七次作业:
本次作业是两道关于图形卡片类的游戏设计题目。题目要求掌握类的继承、多态性的使用方法以及接口的应用。
1)继承:
继承是面向对象两大特征之一,继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。比如:圆是图形,圆拥有继承者的特性,同时也有自己的特性。通过使用继承我们能够更加方便地复用以前的代码,大大的提高开发的效率。
a.继承首先要满足“A是B”的条件,则A可以继承B,B为父类,A为子类。
b.除了那些private的外还有构造器是子类继承不了的。对于构造器而言,它只能够被调用,而不能被继承。 调用父类的构造方法使用super()。
c.对于protected而言,对于它指明的类用户相当于private,但是对于任何继承与此类的子类或者其他任何位于同一个包的类而言他可以访问。
2)多态:
在Java中有两种形式可以实现多态:继承和接口。继承都是单继承,只能为一组相关的类提供一致的服务接口。但是接口可以是多继承多实现,它对于继承来说有更好的灵活性。
Map 初始化:Map<String, String> map = new HashMap<String, String>();
插入元素:map.put("key1", "value1");
获取元素:map.get("key1")
移除元素:map.remove("key1");
清空map:map.clear();
3)接口和抽象类的区别
a.成员的区别
抽象类:
构造方法:有构造方法,用于子类实例化使用。
成员变量:可以是变量,也可以是常量。
成员方法:可以是抽象的,也可以是非抽象的。
接口:
构造方法:没有构造方法
成员变量:只能是常量。默认修饰符:public static final
成员方法:jdk1.7只能是抽象的。默认修饰符:public abstract (推荐:默认修饰符请自 己永远手动给出)
b.类和接口的关系区别
类与类:
继承关系,只能单继承。可以多层继承。
类与接口:
实现关系,可以单实现,也可以多实现。
类还可以在继承一个类的同时实现多个接口。
接口与接口:
继承关系,可以单继承,也可以多继承。
第八、九次作业:
第八次题目是ATM机类结构设计,需要一个银联及其中两家银行,四个客户,客户有N个账户,每个账户对应一张卡,到几个不同编号的ATM机上办理业务。跨行取款、取款超过余额、或者账户与ATM机所对应的银行不同会显示错误,未输入金额时则会显示查询余额业务,输入的金额为正数则为取款,输入负数则为存款。
第九次题目是第八次作业题目的升级版,其中银联中增加了透支取款手续费及透支最大限额以及跨行取款手续费,同时增加了一个银行,在客户方面也增加了一些客户以及账号类型。
这两次作业要注意的是各个实体之间的关系,尤其是一对多的组合关系,在实体类的设计要做到单一职责原则,且不能缺少规定的实体类。在“合成复用原则”及“单一职责原则”的基础上,对上一次作业进行重构,使之符合“开闭原则”。
1)一对多关系:一个学校包含多个学生,一个学生属于一个学校。示例代码:
1 import java.util.ArrayList; 2 import java.util.List; 3 4 public class School { 5 private String name; 6 private List<Student> allStudents; // 一个学校有多个学生 7 8 public School() { 9 this.allStudents = new ArrayList<Student>();// 实例化List集合 10 } 11 12 public School(String name) { 13 this(); 14 this.setName(name); 15 } 16 17 public String getName() { 18 return name; 19 } 20 21 public void setName(String name) { 22 this.name = name; 23 } 24 25 public List<Student> getAllStudents() { 26 return allStudents; 27 } 28 29 public void setAllStudents(List<Student> allStudents) { 30 this.allStudents = allStudents; 31 } 32 33 // 重写toString()方法 34 public String toString() { 35 return "学校名称:" + this.name; 36 } 37 }
1)单一职责原则:
一个类只负责一项职责。优点:可以降低类的复杂度,一个类只负责一项职责,其逻辑肯定要比负责多项职责简单的多;提高类的可读性,提高系统的可维护性;变更引起的风险降低,变更是必然的,如果单一职责原则遵守的好,当修改一个功能时,可以显著降低对其他功能的影响。
2)开闭原则:
开闭原则指对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。简言之,是为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类。
作业过程:
题目集7
7-1
设计与分析:
第一题是较为简单的图形卡片排序,根据第一行数字所代表的卡片图形类型,依次输入各图形的相关参数,通过代码实现排序前的各图形类型及面积、排序后的各图形类型及面积及所有图形的面积总和。第二题是第一题的进阶版,图形卡片分组游戏,需要用到类的继承。多态性使用以及接口的应用,根据第一行数字所代表的卡片图形类型,依次输入各图形的相关参数。参考类图如下:
踩坑心得:
需要对Comparable接口中CompareTo方法重写。
1 class Card implements Comparable<Card>{ 2 private Shape shape; 3 public Card() {} 4 public Card(Shape shape) { 5 super(); 6 this.shape = shape; 7 } 8 public Shape getShape() { 9 return shape; 10 } 11 public void setShape(Shape shape) { 12 this.shape = shape; 13 } 14 @Override 15 public int compareTo(Card card) { 16 // TODO Auto-generated method stub 17 int one = (int)shape.getArea(); 18 int two = (int)card.getShape().getArea(); 19 return two - one; 20 } 21 }
7-2
设计与分析:
第二题是第一题的进阶版,图形卡片分组游戏,需要用到类的继承。多态性使用以及接口的应用,根据第一行数字所代表的卡片图形类型,依次输入各图形的相关参数。分组原理如下:
踩坑心得:
改进建议:
题目集8
设计与分析:
本次作业需要一个银联及其中两家银行,四个客户,客户有N个账户,每个账户对应一张卡,到几个不同编号的ATM机上办理业务。跨行取款、取款超过余额、或者账户与ATM机所对应的银行不同会显示错误,未输入金额时则会显示查询余额业务,输入的金额为正数则为取款,输入负数则为存款。
踩坑心得:
一开始我是想直接在题目集第一题图形卡片排序游戏的代码基础上进行修改和完善,添加一些类来做到分类的目的,但是多次尝试之后发现漏洞百出并不简单,所以就重新写了。
改进建议:
题目集9
设计与分析:
第九次作业是第八次作业题目的升级版,其中银联中增加了透支取款手续费及透支最大限额以及跨行取款手续费,同时增加了一个银行,在客户方面也增加了一些客户以及账号类型。
这两次作业要注意的是各个实体之间的关系,尤其是一对多的组合关系,在实体类的设计要做到单一职责原则,且不能缺少规定的实体类。在“合成复用原则”及“单一职责原则”的基础上,对上一次作业进行重构,使之符合“开闭原则”。
踩坑心得:
改进建议:
总结:
这三次作业主要是关于面向对象的三大特性:封装、继承、多态的复习,以及关于接口、单一原则、开闭原则的练习。
封装继承多态我认为是逐步递进的一个过程,多态的前提就是封装继承,有了这样的前提,我们可以进行方法的重载和重写 ,使得代码更加灵活简洁,可读性更强。
接口可以理解为一种特殊的类,里面全部是由全局常量和公共的抽象方法所组成。因为Java不支持多继承,所以Java可以通过实现接口来弥补这个局限。 为了声明一个接口,我们使用interface这个关键字, 为了实现这个接口,我们使用implements关键词去实现接口。
单一原则是在程序设计中必不可少的,单一原则要求,每一个类的功能具体单一,如图形类就存放图形信息,信息处理类就处理各种数据,每个类的功能职责单一带来的好处是显而易见的,每个类由每个类独特的职责,不必去纠结某个功能究竟应该在哪个步骤中实现,代码的可读性,可维护性都大大提升。
开闭原则的意思是,一个程序在面向拓展时时开放的,面向修改时时封闭的。
这一周期的作业学到了很多面向对象的专业知识,同时也复习了之前学过的知识。但触难于理解,部分类型的题目对于我而言还是有一定的难度的,希望在今后的学习中可以巩固之前所学的知识并且深入对面向对象编程的了解。