201521123077 《Java程序设计》第5周学习总结
1. 本周学习总结
1.1 尝试使用思维导图总结有关多态与接口的知识点。
举个小栗子:
右侧的四个类都实现了同一个接口,所以可以让游戏类的引用指向实现类的实例,根据不同类型的实现类可以表现出不同的特性,所以他们表现出了多态性
1.2 可选:使用常规方法总结其他上课内容。
- Comparable Comparator 接口的使用
- 抽象类的使用
2. 书面作业
Q1. 代码阅读:Child压缩包内源代码
1.1 com.parent包中Child.java文件能否编译通过?哪句会出现错误?试改正该错误。并分析输出结果。
不能编译通过
public void getParenti(){
System.out.println(i);
}
中间输出i这里会报错,因为父类Parent的i是private访问权限的,子类也不可访问。
调用继承自父类的geti()方法即可。
1.2 另外一个包中的OutOfParentPackage.java,能否编译通过?提示什么错误?分析原因。
也不能编译通过
- 因为Parent为默认的包访问权限 即只有在同一个包内才可以访问这个类
System.out.println(p.j);
这里也不能访问jSystem.out.println(p.geti());
这里的geti()也不能访问
2.3点的错误都是因为这两个方法/属性是protected访问权限的,该权限允许子类及同一包内访问,不允许其他包访问
1.3 回答:如果为了访问到protected修饰的属性或方法应该怎么办?
将该类放到同一包内或是继承该类
Q2.abstract进阶:阅读GuessGame抽象类的设计与使用源代码
2.1 Guess改造前代码很简单,而改造后的代码使用了抽象类、抽象方法看起来很复杂,那这样的改造到底有什么好处呢?
将游戏中的方法设定为抽象方法,使其不与某个特定的函数绑定,使用的时候只要对应的重写该抽象方法即可,便于在转移至另一个平台的时候修改
2.2 如果想将该游戏改造成图形界面,应该进行一些什么操作?
重写 1.print 2. println 3.nextInt方法
例如nextInt方法就可以 :
用swing做一个数字键盘,通过点击对应的数字时获取不同的数字传入go()函数内 。
2.3 结合该例子,你觉得什么时候应该使用abstract?
当某个类/方法只是作为一个模板的作用时就可以把它设为abstract,具体实现的时候再把抽象变为具体就好
2.4 重要:在这个例子中,变化的是什么,不变的是什么?尝试结合abstract、继承等概念进行说明。
变化的是游戏中人机交互的输入输出,不变的是猜数字这个游戏的游戏逻辑
所以我们将变化的部分设为abstract,在使用的时候写一个新类继承自这个抽象类,并实现它的抽象方法
程序编写的时候将变化与不变的部分分离开可以有效的减少未来需要修改时候的成本
Q3.Comparable与Comparator
3.1 描述Comparable接口的用途。为什么某个类实现了Comparable接口就可以直接使用Arrays.sort对其进行排序?
使实现它的类具有可排序的性质
因为类实现了Comparable接口之后,并重写了它的compareTo方法后,Arrays.sort排序的时候就可以通过调用compareTo方法确定用户类的两个对象之间的顺序
3.2 有了Comparable接口为什么还需要Comparator接口呢?
Comparable使实现它的类具有了可排序的性质,但是该类的排序规则在类编写完毕后就是确定的了
而Comparator的使用就比较灵活了,实现这个接口的类完全可以不要任何其他的方法属性,仅仅作为一种“比较器”作为排序方法的参数来使用,利用这个方法我们可以在不修改某个类的情况下对它进行不同规则的排序
3.3 可选:使用匿名内部类、Lambda表达式实现PTA编程5-2。
匿名内部类:
Lambda表达式环境不支持还没有尝试
Q4面向接口案例分析
阅读Case-StudentDao.zip案例
4.1 画出类关系图,描述每个类与接口的作用。
4.2 StudenDaoListImpl与StudentDaoArrayImpl有何区别?
二者都是对同一个接口的实现
储存数据的形式不同,前者用arraylist保存,后者直接用数组保存
然后具体的写/读数据方式都不一样,根据具体的保存方法具体定制,例如list就只要调用add方法就可以添加,数组则需要通过遍历找到第一个未被赋值的位置并赋值
Q5.什么是面向接口编程?面向接口编程的好处是什么?
结合题目3与4中的Test.java的代码讨论分析。不要百度原封不动照搬!
编程的时候先写好接口,然后根据这些接口来编程,项目的各个独立的部分依靠接口来对接,相当于设定了一个各部分共同遵守的规则来保证程序各部分能够正常的组合在一起
如第三题中sort方法负责根据Comparable接口确定排序规则,而用户类遵守Comparable接口规则来实现具体的比较关系
第四题中也是如此用户只需要知道StudentDao接口中的方法可以写/读数据,而不依赖具体怎么做到的
面向接口编程使程序有更高的灵活性,修改成本也变得更低
第6题提交作业的结构:*
- 6.1
学生A孙慧君201521123098 | 学生B孙志威201521123077 | 项目地址 |
---|---|---|
http://www.cnblogs.com/niverse745 / | https://home.cnblogs.com/u/agts | https://git.oschina.net/agts/Online_shopping.git |
-
6.2 常用功能描述框架图
-
6.3 关键代码
-
主要框架:
-
购物车添加:
-
购物车删除:
-
查找商品/商家:
-
保存商品到购物车:
-
商品排序方法:
-
商品查找:
-
-
6.4 运行界面
主界面:
登录:
菜单:
添加删除:
排序:
筛选:
注册: (生成用户数据文件) (为了展示将所有用户列出)
防止暴力破解(冷却时间):
Q2面向对象设计(大作业)
3. PTA实验总结及码云上代码提交记录
3.1本周PTA截图
3.2 实验总结
4.1 将具体行为写在actionListener的actionPerformed方法里,
但是自己定义的Scanner sc会遇到无法在内部类中使用的问题,遵循建议将其设为final就行了
5.1 重写compareTo方法即可
5.2 重写compare方法即可
5.3 stack.pop的时候只要将“指针”往栈底移动就好,没必要将要pop的那一位数据清零,然后注意做好判断不要越界就好