201521123037 《Java程序设计》第5周学习总结
1. 本周学习总结
1.1 尝试使用思维导图总结有关多态与接口的知识点。
1.2 可选:使用常规方法总结其他上课内容。
接口:
接口简而言之是方法声明和常量值的集合,接口中所有的方法默认为public abstract,常量值默认为public static final。
实现接口的类叫接口的实现类。
接口的本质是对行为的抽象,java8之后,允许方法的实现,需要在方法名前加default关键字。
所有实现接口的实现类has a接口里的方法,实现类之间的关系并不重要。
interface表定义接口,implement表类实现某接口,extends表示对接口进行扩展或继承。
接口不是类,不能用new进行实例化
Comparable接口和Comparator接口。Comparable接口有compareTo方法,内比较器,排序接口表示实现该接口的类支持排序,采用的一般是自然比较法,方法传入的参数只有一个,返回的是int值;Comparator接口有compare方法,外比较器,方法传入的参数有两个,返回的也是int值。当某个自定义的对象需要作比较的时候,把比较器和对象一起传递过去就可以比大小。两者都可以被运用到Collection.sort以及Arrays.sort中,进行排序。
sort(Object[]) 所有的对象都必须实现Comparable接口,它用来确定对象之间的大小关系,sort(Object[], Comparator) 、对象不必实现Comparable接口,由Comparator来确定对象之间的大小关系。
多态:
体现在多个实现类拥有同一行为,实现类可转化为接口这一类型,进行统一操作,在运行时实例化对象且调用实现类的接口方法。
参考资料:
百度脑图
XMind
2. 书面作业
1. 代码阅读:Child压缩包内源代码
1.1 com.parent包中Child.java文件能否编译通过?哪句会出现错误?试改正该错误。并分析输出结果。
不能编译通过。
System.out.println(i);
该句出错,原因Child的父类定义i的权限为private,只限在类内部调用。应使用父类的geti()方法调用i。
System.out.println(i);
改为System.out.println(geti());
输出的结果:
c.getParenti();
输出Child的i(调用Parent的i)c.getParentj();
输出父类Parent的j,Child的j(调用Parent的j),Child的i(调用Parent的i),父类Parent的i,Other.showParentj(p);
输出Parent的j和i。
1.2 另外一个包中的OutOfParentPackage.java,能否编译通过?提示什么错误?分析原因。如何更改才能使之正常编译?
不能编译通过,提示The type Parent is not visible即Parent类不可见。
原因:Parent类的权限为无,在不同包中不可被调用。解决:将Parent类的权限改为更大一些如public或protected。
2. abstract进阶:阅读GuessGame抽象类的设计与使用源代码
2.1 Guess改造前代码很简单,而改造后的代码使用了抽象类、抽象方法看起来很复杂,那这样的改造到底有什么好处呢?
使用了抽象类、抽象方法后,代码显得更有弹性,添加的
java.util.Scanner
类,用于扫描输入文本的实用程序。改造后抽象类、抽象方法可以自己进行编写,输出与输入就不局限于扫描输入输出文本。
2.2 如果想将该游戏改造成图形界面,应该进行一些什么操作?
建立容器-建立组建-将组建添加到容器当中-设置布局 (PS:来自百度),设计的图形界面放在主函数中调用。
2.3 结合该例子,你觉得什么时候应该使用abstract?
对类或方法的具体实现还不够确定时,将其抽象化,再根据实际情况进行编写使得代码更具弹性。(不够完善,进行补充)抽象方法必然存在于抽象类中,抽象类可有非抽象的方法,当对抽象的方法和类的具体实现还不够确定的时候,可以先给个框架,不用实现具体完整操作,方便继承该抽象类的一个或多个子类能够拥有具有自身特性的具体实现方法。如Shape抽象类中有getArea()抽象方法,长方形和圆形为其子类,覆盖该抽象方法的具体实现是不同的。
2.4 重要:在这个例子中,变化的是什么,不变的是什么?尝试结合abstract、继承等概念进行说明。
在这个例子中,变化的是代码所处的环境,不变的是代码实现的功能即完成猜数游戏这个整体架构。对于是对话框界面图形输入还是窗口输入...具体的输入形式还不确定。所以先用abstract修饰类。abstract为抽象,抽象类或抽象方法只声明了它的作用,未对方法进行具体的实现,增强了代码的弹性,方便以后根据代码的外界环境进行编写。未被继承的抽象类是没有意义的,只有实现了抽象类并应用,抽象类才有存在的意义。
3. Comparable与Comparator
3.1 描述Comparable接口的用途。为什么某个类实现了Comparable接口就可以直接使用Arrays.sort对其进行排序?
Comparable接口里有抽象方法compareTo,用来比较对象的大小。
if (((Comparable)src[mid-1]).compareTo(src[mid]) <= 0) {
System.arraycopy(src, low, dest, destLow, length);
return;
}
for(int i = destLow, p = low, q = mid; i < destHigh; i++) {
if (q >= high || p < mid && ((Comparable)src[p]).compareTo(src[q])<=0)
dest[i] = src[p++];
else
dest[i] = src[q++];
}
查看Arrays.sort源代码,sort将传入的参数强制转换为Comparable接口,且调用Comparable接口的compareTo方法对数组进行排序。
3.2 有了Comparable接口为什么还需要Comparator接口呢?
Comparable接口是内比较器,采用的一般是自然比较法,方法传入的参数只有一个;Comparator接口有compare方法是外比较器,方法传入的参数有两个。
1.实现类实现了Comparable接口,但是对compareTo方法内的比较算法不满意可选实现Comparator接口
2.需要对传入的两个对象进行比较时可选实现Comparator接口
3.实现Comparator的类是在外部进行比较的,不需要对实现类有任何修改,而实现Comparable类需要在实现类中做修改
4.可以在实现Comparator的类进行各种排序,多种排序方式可创建多种实现Comparator类来实现
具体选用哪种接口进行比较需要根据实际情况进行选择。
3.3 可选:使用匿名内部类、Lambda表达式实现PTA编程5-2。
4. 面向接口案例分析
阅读Case-StudentDao.zip案例
4.1 画出类关系图,描述每个类与接口的作用。
4.2 StudenDaoListImpl与StudentDaoArrayImpl有何区别?
学生信息存储的形式不同。StudenDaoListImpl是用列表实现存储学生信息,支持存取不定长度的对象数组;StudentDaoArrayImpl是用数组存储学生信息,需要已知数组的大小。
5.1 什么是面向接口编程?面向接口编程的好处是什么?结合题目3与4中的Test.java的代码讨论分析。不要百度原封不动照搬!
package chpt06;
public class Test {
public static void main(String[] args) {
Student[] students = new Student[3];
students[0] = new Student("Tom");
students[1]= new Student("Jerry");
students[2] = new Student("Sophia");
StudentDao sdm = new StudentDaoArrayImpl(50);//使用数组实现
//StudentDao sdm = new StudenDaoListImpl();//使用列表实现
//往后台写数据,无需考虑后台是什么(到底是数据库、文件、数组、List)
//因为这里是面向StudentDao接口
System.out.println("===========写入学生========");
for(Student e:students){
if (!sdm.writeStudent(e)){
System.out.println("添加学生失败");
}else{
System.out.println("插入成功!!");
}
}
System.out.println("===========显示所有学生========");
sdm.diplayAllStudent();
System.out.println("===========查询学生========");
Student temp = sdm.readStudent("Tom") ;
if(temp == null){
System.out.println("查无此人");
}else{
System.out.println(temp);
}
}
}
该代码里面StudentDao为接口,StudenDaoListImpl为实现该接口的列表类,StudentDaoArrayImpl为实现给接口的数组类,Student完成学生基本信息的存储即读取。实现某接口的类之间可以没有什么关系,他们共同拥有该接口的行为。在一个面向对象的系统中,系统的各种功能是由许许多多的不同对象协作完成的。在这种情况下,各个对象内部是如何实现并不重要,重要的是各个对象之间的协作。面向接口是面向对象编程体系的思想精髓之一。接口从更深层次的理解,应是定义(规范,约束)与实现(名实分离的原则)的分离。接口的本身反映了系统设计人员对系统的抽象理解。在表面上是由几个没有主体代码的方法定义组成的集合体,有唯一的名称,可以被类或其他接口所实现(或者也可以说继承)。面向interface编程,原意是指面向抽象协议编程,实现者在实现时要严格按协议来办。面向对象编程是指面向抽象和具象。抽象和具象是矛盾的统一体,不可能只有抽象没有具象。面向接口编程使得代码更具弹性,逻辑清晰,代码易懂,方便扩展,可维护性强。接口和实现进行分离,后期可以通过具体的实际环境对实现类进行编写。主要为了实现松散耦合的系统,便于以后升级,扩展。
6. 结对编程:面向对象设计(大作业2-非常重要)
内容:使用Java代码完成上周做的面向对象设计大作业,需要有初步界面。实现的功能尽量简单,少而精,只包含必要的功能,不要追求高大全。
写出:类图(尽量精简,不用太多子类,两个即可)、系统常用功能描述、关键代码与界面
形式: 两人依托码云合作完成。请在这里贴出你们的学号、姓名与任务分工。
注意: 再过几次课要讲Java图形界面编程,到时候要将该系统升级为图形界面。系统的业务逻辑部分应该变化不大,变化大的是输入与输出部分。所以编码的时候,输入(Scanner)与输出(System.out)的代码,请不要将其与某个业务处理函数绑死。
选做加分: 给出两人在码云上同一项目的提交记录截图,额外加分。注:两个人在码云上新建一个项目。
参考资料:
结对编程参考资料
可以使用Processon画图
第6题提交作业的结构:
6.1
学生A | 学生B | 项目地址 |
---|---|---|
http://www.cnblogs.com/carol520123/ | https://www.cnblogs.com/qxx-Ultraman/ | http://git.oschina.net/carolfantasy/jieduibiancheng |
晓娴负责编写个人信息的类和菜单,凯欣负责编写商品和购物车的类。 |
6.2 常用功能描述框架图
6.3 关键代码
//商品类
class Goods {
String name;
double price;
String publish;
}
class Books extends Goods{
public Books(String name,double price,String publish){
this.name=name;
this.price=price;
this.publish=publish;
}
@Override
public String toString() {
return "书名:"+name+'\n'+"价格:"+price+'\n'+"出版商:"+publish ;
}
}
class Foods extends Goods{
public Foods(String name,double price){
this.name=name;
this.price=price;
}
@Override
public String toString() {
return "零食名称:"+name+'\n'+"价格"+price ;
}
}
//购物车类
public class Shoppingcart {
public double totalprice=0;
public int totalnumber;
Goods g=new Goods();
public Shoppingcart(Goods g,int totalnumber){
this.g=g;
this.totalnumber=totalnumber;
}
public Shoppingcart(){
this.g=null;
this.totalnumber=0;
}
public int add(int n,int i){
if(i==1)
totalnumber=totalnumber+n;
else
totalnumber=totalnumber-n;
return totalnumber;
}
public double caculate(){
totalprice=(g.price)*totalnumber;
return totalprice;
}
@Override
public String toString() {
return "商品名:"+g.name+'\n'+"数量:"+totalnumber+'\n';
}
}
//用户信息类
public class Perinformation {
String username;
String password;
public Perinformation(String username,String password){
this.username=username;
this.password=password;
}
public Perinformation(){
}
public String toString() {
return "Perinformation [username=" + username + ", password=" + password + "]";
}
}
6.4 运行界面
3. 码云上代码提交记录及PTA实验总结
题目集:jmu-Java-04-面向对象2-进阶-多态接口内部类
3.1. 码云代码提交记录
在码云的项目中,依次选择“统计-Commits历史-设置时间段”, 然后搜索并截图
项目截图:
3.2. PTA实验
继续完成前面未完成的实验面向对象1-基础-封装继承
函数(选做:4-1)、编程(5-1, 5-2)
一定要有实验总结
- 4-1:对题目的理解不是很到位,编译错误,不知道从哪里下手修正。
- 5-1:主要是编写Comparable实现类,按照题目要求在compareTo方法中进行比较大小即可。
- 5-2:编写Comparator实现类,该接口是外比较器,允许多个类实现该接口,满足了题目分别对不同特性进行排序的要求,在调用排序的类前要进行实例化,不然sort(,比较类)中比较类会显示出错。