1. 本周学习总结

1.1 尝试使用思维导图总结有关多态与接口的知识点。

1.2 可选:使用常规方法总结其他上课内容。

  • 上周学习了继承和多态,满足is-a条件,但是发现会导致继承的滥用,如果只是但以的想拥有某种行为或变量,不需要一定要继承才能实现,可以使用接口

  • Comparable和Comparator区别:

    Comparable接口只提供了int compareTo(T o)方法,而Comparator接口只提供了int compare(T o1,T o2)方法

    Comparator位于包java.util下,需要导入java.util.Comparator类,而Comparable位于包java.lang下,不需要导包

    排序方法:

    Collections.sort((List list, Comparator<? super T> c)

    Arrays.sort((List list, Comparable<? super T> c)

  • 接口与抽象类

    抽象类表示这个类是什么,接口类表示这个类能做什么

    抽象类和接口都不能直接实例化

    抽象类可以有具体的方法 和属性,接口只能有抽象方法和不可变常量

    一个类只能继承一个抽象类,而一个类却可以实现多个接口

    接口和抽象类区别

2. 书面作业

1. 代码阅读:Child压缩包内源代码

1.1 com.parent包中Child.java文件能否编译通过?哪句会出现错误?试改正该错误。并分析输出结果。

  1. Child类中
  2. public void getParenti(){
  3. System.out.println(i);//此处报错:i不可见
  4. }
  5. 分析:在Child的类中没有i这个属性,则morning会调用父类的i,但是iprivate修饰,只允许本类访问,可改为protected,这样就可以允许子类访问了
  6. 输出结果:
  7. 1
  8. 2
  9. 2
  10. 1
  11. 1
  12. 2
  13. 1
  14. 分析结果:
  15. 由于子类Child类中没有i,j属性,那么就会使用父类的属性,所以那些输出结果都是用父类的ij

1.2 另外一个包中的OutOfParentPackage.java,能否编译通过?提示什么错误?分析原因。如何更改才能使之正常编译?

  1. public class OutOfParentPackage{
  2. public static void showParentj(Parent p){
  3. System.out.println(p.j); //报错
  4. System.out.println(p.geti());//报错
  5. p.getj(); //报错
  6. }
  7. }

答:不能通过编译,根据eclipse提示可以在Parent类中用getter和setter方法,或者将j的属性改为public修饰的,但是不大安全就是了,同理,也将geti和getj方法改为public的

2. abstract进阶:阅读GuessGame抽象类的设计与使用源代码

2.1 Guess改造前代码很简单,而改造后的代码使用了抽象类、抽象方法看起来很复杂,那这样的改造到底有什么好处呢?

  1. 改造前:
  2. import java.util.Scanner;
  3. public class Guess {
  4. public static void main(String[] args) {
  5. Scanner scanner = new Scanner(System.in);
  6. int number = (int) (Math.random() * 10);
  7. int guess;
  8. do {
  9. System.out.print("猜数字(0 ~ 9):");
  10. guess = scanner.nextInt();
  11. } while(guess != number);
  12. System.out.println("猜中了...XD");
  13. }
  14. }
  15. 改造之后:
  16. public abstract class GuessGame {
  17. public void go() {
  18. int number = (int) (Math.random() * 10);
  19. int guess;
  20. do {
  21. print("输入数字");
  22. guess = nextInt();
  23. } while(guess != number);
  24. println("猜对了");
  25. }
  26. public abstract void print(String text);
  27. public abstract void println(String text);
  28. public abstract int nextInt();
  29. }

分析:改造前的代码比较中规中矩,但只能在控制台输入输出,该造后,用abstract修饰输出输入的方法,使其抽象化,可以在控制台,图形界面或者以其他方式进行

2.2 如果想将该游戏改造成图形界面,应该进行一些什么操作?

  1. 答:首先肯定是要导入工具包,因为输入输出,还有获取输入都是用抽象方法,具体实现的内容是由继承这些类的子类来重写这些方法来实现

2.3 结合该例子,你觉得什么时候应该使用abstract?

  1. 答: 当一个类中没有充足的信息来描述一个具体的对象时,可以用abstract,以不变应万变

2.4 重要:在这个例子中,变化的是什么,不变的是什么?尝试结合abstract、继承等概念进行说明。

  1. 答:可以变化的是继承GuessGame的子类中复写父类的方法,即输入输出的方式;不变的是父类抽象类方法的定义,这些类不需要有具体的内容,毕竟不知道要干啥,可以随机应变,因为任何继承这个抽象类的子类都必须复写父类的抽象方法,这样想做什么就让子类来做就好了

3. Comparable与Comparator

3.1 描述Comparable接口的用途。为什么某个类实现了Comparable接口就可以直接使用Arrays.sort对其进行排序?

在API中查找的结果:

  1. public static void sort(Object[] a)根据元素的自然顺序对指定对象数组按升序进行排序。数组中的所有元素都必须实现 Comparable 接口。此外,数组中的所有元素都必须是可相互比较的(也就是说,对于数组中的任何 e1 e2 元素而言,e1.compareTo(e2) 不得抛出 ClassCastException)。
  2. 保证此排序是稳定的:不会因调用 sort 方法而对相等的元素进行重新排序。
  3. 该排序算法是一个经过修改的合并排序算法(其中,如果低子列表中的最高元素小于高子列表中的最低元素,则忽略合并)。此算法提供可保证的 n*log(n) 性能。
  4. 参数:
  5. a - 要排序的数组
  6. 抛出:
  7. ClassCastException - 如果数组包含不可相互比较的 的元素(例如,字符串和整数)。

简要分析:comparable接口当中含有compareTo比较具体方法,但是只能按一种方式比较

3.2 有了Comparable接口为什么还需要Comparator接口呢?

  1. Arrays.sort(T[] a, Comparator<? super T> c)
  2. 根据指定比较器产生的顺序对指定对象数组进行排序。
  3. API文档中查找的结果:
  4. sort
  5. public static <T> void sort(T[] a,
  6. Comparator<? super T> c)根据指定比较器产生的顺序对指定对象数组进行排序。数组中的所有元素都必须是通过指定比较器可相互比较的(也就是说,对于数组中的任何 e1 e2 元素而言,c.compare(e1, e2) 不得抛出 ClassCastException)。
  7. 保证此排序是稳定的:不会因调用 sort 方法而对相等的元素进行重新排序。
  8. 该排序算法是一个经过修改的合并排序算法(其中,如果低子列表中的最高元素小于高子列表中的最低元素,则忽略合并)。此算法提供可保证的 n*log(n) 性能。
  9. 参数:
  10. a - 要排序的数组
  11. c - 确定数组顺序的比较器。null 值指示应该使用元素的自然顺序。
  12. 抛出:
  13. ClassCastException - 如果数组包含使用指定的比较器不可相互比较的 的元素。

简要分析:有了Comparable接口,Arrays.sort实现比较算法进行排序,但是形式比较单一,有了Comparator接口,在集合外定义compare()的方法,可以重写compare方法。传入了两个参数,就可以根据不同的排序要求作出排序,比较灵活,在书上284页也有相应的例子

3.3 可选:使用匿名内部类、Lambda表达式实现PTA编程5-2。

  1. 匿名内部类:(主要代码)
  2. Comparator<PersonSortable2> n1 = new Comparator<PersonSortable2>() { //按年龄升序,定义了匿名内部类
  3. public int compare(PersonSortable2 o1, PersonSortable2 o2) {
  4. return o1.getAge() - o2.getAge();
  5. }
  6. }; //注意此处的分号
  7. Arrays.sort(p, n1);
  8. System.out.println("NameComparator:sort");
  9. for (int i = 0; i < n; i++) {
  10. System.out.println(p[i]);
  11. }
  12. Comparator<PersonSortable2> n2 = new Comparator<PersonSortable2>() { //按姓名升序排序
  13. public int compare(PersonSortable2 o1, PersonSortable2 o2) {
  14. return o1.getName().compareTo(o2.getName());
  15. }
  16. };
  17. Arrays.sort(p, n2);
  18. System.out.println("AgeComparator:sort");
  19. for (int i = 0; i < n; i++) {
  20. System.out.println(p[i]);
  21. }
  22. System.out.println(Arrays.toString(n1.getClass().getInterfaces()));
  23. System.out.println(Arrays.toString(n2.getClass().getInterfaces()));
  1. Lambda表达式:
  2. Comparator<PersonSortable2> n1 = (PersonSortable2 o1, PersonSortable2 o2) -> (o1.getName().compareTo(o2.getName()));
  3. Comparator<PersonSortable2> n2 = (PersonSortable2 o1, PersonSortable2 o2) -> (o1.getAge() - o2.getAge());
  4. 补充格式:
  5. 参数 -> 表达式或程序块{ }
  6. 如果是表达式,则return该表达式的值(无需写return语句)
  7. 如果是程序块{ },可以包含多条语句

截图:

4. 面向接口案例分析

阅读Case-StudentDao.zip案例

4.1 画出类关系图,描述每个类与接口的作用。

此图由eclipse的UML自动生成



Student类当中只有name这个属性,有有参的构造函数,还有其对应的setter和getter方法

StudentDao接口定义了读写学生信息和显示全部学生信息的抽象方法,

StudenDaoListImpl类实现了StudentDao接口,用列表来存储Student类的对象,readStudent方法是通过遍历列表找到目标,writeStudent是直接通过add添加新的对象

StudentDaoArrayImpl类也实现了StudentDao接口,不过是默认存储Student对象数组大小为80,与StudenDaoListImpl类有点不同的是读入信息是判断数组元素是否为空,才存入数组,其他大同小异

Test类就是含有入口函数,测试用的

4.2 StudenDaoListImpl与StudentDaoArrayImpl有何区别?

  1. 答:顾名思义,前者是用List列表来存储对象,后者是用数组来存储对象,只是实现方式不一样,结果是一样的

5. 什么是面向接口编程?面向接口编程的好处是什么?

结合题目3与4中的Test.java的代码讨论分析。不要百度原封不动照搬!

  1. 答;面向接口编程就是在面向对象的前提下,由于各个对象之间有可能存在协作关系,所以可以采用接口来实现交互,题目3中的ComparableComparator接口同样都是用来比较的,但是后者是可以比较一个类生成的两个对象之间属性的比较,同为比较,但是实现的方式不同,题目4StudenDaoListImplStudentDaoArrayImpl同样实现的结果是一样的,面向接口编程,就是在实现的方式不清楚的情况下,定义的一个接口,让其他类实现这个接口,再根据情况来写具体的内容,有了接口可变性比较强,能够解决需求变化。在书上202页第一段就有提到:写程序要有弹性,要有可维护性。

6. 结对编程:面向对象设计(大作业2-非常重要)

6.1内容:使用Java代码完成上周做的面向对象设计大作业,需要有初步界面。实现的功能尽量简单,少而精,只包含必要的功能,不要追求高大全。

写出:类图(尽量精简,不用太多子类,两个即可)、系统常用功能描述、关键代码与界面

形式: 两人依托码云合作完成。请在这里贴出你们的学号、姓名与任务分工。

注意: 再过几次课要讲Java图形界面编程,到时候要将该系统升级为图形界面。系统的业务逻辑部分应该变化不大,变化大的是输入与输出部分。所以编码的时候,输入(Scanner)与输出(System.out)的代码,请不要将其与某个业务处理函数绑死。

选做加分: 给出两人在码云上同一项目的提交记录截图,额外加分。注:两个人在码云上新建一个项目。

参考资料:

结对编程参考资料

可以使用Processon画图


参考书面作业第3、4题的做法,使输入输出抽象化

类图:

学生L 学生null 项目地址
https://q.cnblogs.com/u/lyq063/ https://git.oschina.net/jmulyq/ShoppingCart.git

6.2 常用功能描述框架图

6.3 关键代码

  1. 输入输出接口:
  2. public interface shop {
  3. //输入输出方式抽象化
  4. public void print(String text);
  5. public abstract void println(String text);
  6. public abstract int nextInt();
  7. public abstract Double nextDouble();
  8. public abstract String next();
  9. }
  10. 菜单类:
  11. public class Menu implements shop{
  12. private Scanner scan = new Scanner(System.in);
  13. int k=0;
  14. public void showmenu(Cart cart){
  15. println("**********欢迎光临**********");
  16. println(" 1.浏览商品");
  17. println(" 2.查找商品");
  18. println(" 3.加入购物车");
  19. println(" 4.我的购物车");
  20. println(" 0.退出");
  21. println("请选择:");
  22. int choice=nextInt();
  23. Iterm[] booklist=Iterm.allproduct();
  24. switch(choice){
  25. case 1:{
  26. for(Iterm i:booklist){
  27. println(i.toString2());
  28. }
  29. break;
  30. }
  31. case 2:{
  32. boolean flag=false;
  33. String prudoct=next();
  34. for(k=0;k<booklist.length;k++){
  35. if(booklist[k].getName().equals(prudoct)){
  36. println(booklist[k].toString2());
  37. flag=true;
  38. break;
  39. }
  40. }
  41. if(!flag){
  42. println("您所查找的商品未找到,请重新输入");
  43. k=-1;
  44. }else
  45. break;
  46. }
  47. case 3:{
  48. if(k>=0){
  49. println("请输入数量:");
  50. int num=nextInt();
  51. booklist[k].setNumber(num);
  52. cart.addproduct(booklist[k]);
  53. cart.cartmenu(booklist[k]);
  54. }
  55. else{
  56. println("错误操作,还未选择商品!");
  57. }
  58. break;
  59. }
  60. case 4:{
  61. cart.cartmenu(booklist[k]);
  62. break;
  63. }
  64. case 0:return;
  65. }
  66. showmenu(cart);
  67. }
  68. @Override
  69. public void print(String text) {
  70. System.out.print(text);
  71. }
  72. @Override
  73. public void println(String text) {
  74. System.out.println(text);
  75. }
  76. @Override
  77. public int nextInt() {
  78. return scan.nextInt();
  79. }
  80. @Override
  81. public Double nextDouble() {
  82. return scan.nextDouble();
  83. }
  84. @Override
  85. public String next() {
  86. return scan.next();
  87. }
  88. }
  89. 商品类:
  90. public class Iterm{
  91. private String name;
  92. private double price;
  93. public int number;
  94. ...一堆settergettertoString方法(含有两种格式,一种是不需要输出数量的)
  95. }
  96. 购物车类:
  97. public class Cart implements shop {
  98. ArrayList<Iterm> iterm = new ArrayList<Iterm>();
  99. private Scanner scan = new Scanner(System.in);
  100. public void cartmenu(Iterm i) {
  101. println("1.删除商品");
  102. println("2.结算全部商品");
  103. println("3.清空购物车");
  104. println("4.显示购物车中所有商品");
  105. println("0.返回菜单");
  106. println("请选择:");
  107. int c = nextInt();
  108. switch (c) {
  109. case 1: {
  110. deleteproduct(i);
  111. break;
  112. }
  113. case 2: {
  114. System.out.println(allmoney());
  115. break;
  116. }
  117. case 3: {
  118. iterm.clear();
  119. break;
  120. }
  121. case 4:{
  122. for(Iterm i1:iterm){
  123. System.out.println(i1.toString());
  124. break;
  125. }
  126. }
  127. case 0: {
  128. return;
  129. }
  130. }
  131. }
  132. public void addproduct(Iterm i) {
  133. if(iterm.contains(i)){
  134. iterm.get(iterm.indexOf(i)).number+=i.number;
  135. }
  136. else iterm.add(i);
  137. }
  138. public void deleteproduct(Iterm i) {
  139. iterm.remove(i);
  140. }
  141. public double allmoney() {
  142. double sum = 0;
  143. for (Iterm i : iterm) {
  144. sum += i.getPrice() * i.getNumber();
  145. }
  146. return sum;
  147. }
  148. public void showcartproduct() {
  149. for (Iterm i : iterm) {
  150. println(i.toString());
  151. }
  152. }
  153. ...还有复写接口输入输出的方法
  154. }
  155. 测试类:
  156. public class PersonTest {
  157. public static void main(String[] args) {
  158. Menu menu=new Menu();
  159. Cart cart=new Cart();
  160. menu.showmenu();
  161. }
  162. }

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

    这题编写了PersonSortable类,实现了Comparable接口,根据题意来重写compareTo和toString方法

    比较简单,注意Comparable,“< >”内要写比较的对象

  • 5-2

    这题用的是比较器,需要import java.util.Comparator;,应为这题要求是分别对姓名和年龄排序,所以可以重写compare方法,传入两个对象进行属性之间的比较

    注意最后排序时候要Arrays.sort(p,new一个对象)才行,根据要求来创建对象,实现不同的排序方法

201521123063 《JAVA程序设计》 第5周学习总结的更多相关文章

  1. 20145213《Java程序设计》第九周学习总结

    20145213<Java程序设计>第九周学习总结 教材学习总结 "五一"假期过得太快,就像龙卷风.没有一点点防备,就与Java博客撞个满怀.在这个普天同庆的节日里,根 ...

  2. 20145213《Java程序设计》第二周学习总结

    20145213<Java程序设计>第二周学习总结 教材学习内容总结 本周娄老师给的任务是学习教材的第三章--基础语法.其实我觉得还蛮轻松的,因为在翻开厚重的书本,一股熟悉的气息扑面而来, ...

  3. 20145213《Java程序设计》第一周学习总结

    20145213<Java程序设计>第一周学习总结 教材学习内容总结 期待了一个寒假,终于见识到了神秘的娄老师和他的Java课.虽说算不上金风玉露一相逢,没有胜却人间无数也是情理之中,但娄 ...

  4. 21045308刘昊阳 《Java程序设计》第九周学习总结

    21045308刘昊阳 <Java程序设计>第九周学习总结 教材学习内容总结 第16章 整合数据库 16.1 JDBC入门 16.1.1 JDBC简介 数据库本身是个独立运行的应用程序 撰 ...

  5. 20145330孙文馨 《Java程序设计》第一周学习总结

    20145330孙文馨 <Java程序设计>第一周学习总结 教材学习内容总结 刚开始拿到这么厚一本书说没有压力是不可能的,开始从头看觉得很陌生进入不了状态,就稍微会有一点焦虑的感觉.于是就 ...

  6. 20145337 《Java程序设计》第九周学习总结

    20145337 <Java程序设计>第九周学习总结 教材学习内容总结 数据库本身是个独立运行的应用程序 撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的增删查找 JDBC可以 ...

  7. 20145337 《Java程序设计》第二周学习总结

    20145337 <Java程序设计>第二周学习总结 教材学习内容总结 Java可分基本类型与类类型: 基本类型分整数(short.int.long).字节(byte).浮点数(float ...

  8. 20145218《Java程序设计》第一周学习总结

    20145218 <Java程序设计>第一周学习总结 教材学习内容总结 今天下午看了Java学习的视频,感觉很是新奇,之前觉得Java学起来是艰难枯燥的,但通过第一章的学习觉得如果自己可以 ...

  9. 《Java程序设计》第九周学习总结

    20145224 <Java程序设计>第九周学习总结 第十六章 整合数据库 JDBC入门 ·数据库本身是个独立运行的应用程序 ·撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的 ...

  10. 《Java程序设计》第二周学习总结

    20145224陈颢文<Java程序设计>第二周学习总结 教材学习内容总结 一.类型.变量与运算符 1.类型 整数: 可细分为为short整数(占2字节),int整数(占4字节),long ...

随机推荐

  1. JFFS2文件系统的移植

    Linux文件系统的移植-JFFS2 JFFS2是JFFS的后继者,由Red Hat重新改写而成.JFFS2的全名为JournallingFlash File System Version 2(闪存日 ...

  2. php 单引号,双引号,反引号区别

    PHP中单引号,双引号,反引号具有不同的含义,最大的几项区别如下: 一.单引号中,任何变量($var).特殊转义字符(如"\t \r \n"等)不会被解析,因此PHP的解析速度更快 ...

  3. Eclipse配置Tomcat服务器

    Eclipse配置Tomcat服务器.. ---------------- ---------------- ---------------- ---------------- ----------- ...

  4. Java的static关键字

    本文参考:Java的static关键字 通过static关键字可以满足两方面的需要.一种情形是,只想为某特定域分配单一存储空间,而不去考虑究竟要创建多少对象,甚至根本就不创建任何对象.另一种情形是,希 ...

  5. 最长单词(一星级题目) 本来是很简单的,其实就是加个flag

    随机了一个题目: 给一个词典,找出其中所有最长的单词. 这道题对于初学者还是很有用的,毕竟用的逻辑是比较复杂的 样例 在词典 { "dog", "google" ...

  6. PyQt4 初试牛刀二

    一.最小话托盘后,调用showNormal()后窗口不刷新,解决办法如下: 重写showNormal 方法,调用父类方法后,repaint窗体 def showNormal(self):     su ...

  7. python爬虫之一---------豆瓣妹子图

    #-*- coding:utf-8 -*- __author__ = "carry" import urllib import urllib2 from bs4 import Be ...

  8. macaca web(4)

    米西米西滴,吃过中午饭来一篇,话说,上回书说道macaca 测试web(3),参数驱动来搞,那么有小伙本又来给雷子来需求, 登录模块能不能给我给重新封装一下吗, 我说干嘛封装,现在不挺好,于是乎,接着 ...

  9. 移动端车牌识别ocr系统

    移动端车牌识别ocr系统优点: 1.识别速度快:高度优化的车牌定位和识别算法,识别时间≤50毫秒(200万图片). 2.识别率:白天识别率≥99.7%:夜间识别率≥98%. 3.识别速度:单张图片识别 ...

  10. vue echarts 遇到的bug之一 无法渲染的问题

    图表示这样的 页面上有很多个图表,由于没有查询按钮,就只是点击发送ajax数据,所以把所有图表的方法放在updated中, 功能是实现了没问题,但是加载页面的时候会发送很多的ajax请求,而且点击修改 ...