201521123065 《Java程序设计》第5周学习总结

时间:2021-09-09 06:20:07

1. 本周学习总结

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

201521123065 《Java程序设计》第5周学习总结

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

1、ArrayList只能存放对象;
2、对象包装类之间使用equals进行比较;
3、接口可以实现非继承关系的类之间的共同属性功能,可以理解为这些类has a共同的行为;
4、实现了compareble接口的对数组中的元素可以用Arrays.sort进行排序;
5、同继承,可以使用instanceof检查对象是否实现接口;
6、接口中的常量用final修饰,并且可以实现多个接口。

2. 书面作业

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

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

错误的运行结果:

201521123065 《Java程序设计》第5周学习总结

正确的运行结果:

201521123065 《Java程序设计》第5周学习总结

不能编译通过;
运行结果如上;
根据提示可知:将Parents类中的变量i变为protected修饰即可。
输出结果如上;
结果分析:1 是 c.getParenti() 函数的打印结果;
2 2 1 1 是 c.getParentj() 函数的打印结果;
2 1 是 Other.showParentj(p) 函数的打印结果;
并且由于i、j是Parent类的protected变量,Child继承Parent类,允许访问。

1.2 另外一个包中的OutOfParentPackage.java,能否编译通过?提示什么错误?分析原因。

201521123065 《Java程序设计》第5周学习总结

201521123065 《Java程序设计》第5周学习总结

编译无法通过,Parent、i、j、getj()是不可见类型,需用public进行修饰,public可以对所有用户开放,默认类只对当前类和同一个包中允许访问,在不同的包中不可使用。

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

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

抽象类的一个特点是必须被继承,并且抽象方法必须被重写。这样的好处就在于里面的抽象方面如果是放在任意一个类中就被绑定而其他类不得使用,将输出方法作为抽象方法,可以在对话框或者图形界面等其他界面输出。

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

设计一个图形界面的类继承GuessGame类,重写GuessGame类中的输出操作。

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

当某种属性或者方法需要在不同的界面或者类中重新定义和使用时使用抽象类。

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

变化的是使用抽象类将共有的属性方法封装,可在不同领域中使用。不变的是在类中使用被重写与改进前的方法是相同的。
比如用抽象类的Shape对面积周长获取的方法进行声明,则在不同的继承Shape类的其他类中分别重写了面积周长获取方法,当计算面积周长时可直接调用shape,而不用分开调用在相加。
此例中,将输入的方法在抽象类中声明,继承的同时进行重写,就可以在不同的界面(类)中使用。

3、Comparable与Comparator

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

Comparable接口中有CompareTo方法进行对象之间的比较,并且可以自定义比较的内容。但前提是要实现Comparable接口才行。
Arrays.sort的排序功能相当于是冒泡法对数值数组进行排序,只是数组中的元素是对象。
Arrays.sort其实是面向Comparable接口进行编程,因此不需要考虑具体的实现类。

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

201521123065 《Java程序设计》第5周学习总结

201521123065 《Java程序设计》第5周学习总结

从以上JDK文档看来:
虽然两个都是用于比较的,但是Comparable是用于实现内部的排序,而Comparetor是一个专用的比较器,用于当对象使用comparable进行的自身比较不符合要求时,可以用comparetor比较器对两个对象进行外部程序的比较

4、面向接口案例分析

阅读Case-StudentDao.zip案例

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


201521123065 《Java程序设计》第5周学习总结

class Test:main()函数,写数据,界面处理;
class Student:属性、构造函数、方法;
interface StudentDao:声明writeStudent、readStudent、diplayAllStudent函数;
class StudenDaoListImpl:获取学生姓名,添加学生信息,打印学生信息。
class StudentDaoArrayImpl:将不为空并且与参数同名的学生返回,学生信息的存入,成功则返回true。

4.2 StudenDaoListImpl与StudentDaoArrayImpl有何区别?

201521123065 《Java程序设计》第5周学习总结

201521123065 《Java程序设计》第5周学习总结

从以上源代码进行分析:
StudenDaoListImpl是存放Student的动态数组,无需定义数组大小,writeStudent只使用add操作进行添加,而StudentDaoArrayImpl则需要开辟一个数组大小为确定值的数组,并且writeStudent需要对数组中的元素进行名字的比较,相同则将学生信息进行存储。

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

面向接口编程是指药使用已经声明好的接口中,对其中声明的方法进行重新定义编写,比如题目4中的StudentDao接口中声明了读、写操作,StudenDaoListImpl 、StudentDaoArrayImpl 类实现了Student接口,同时也分别对读写操作进行编程。
接口编程将接口与实现分离,就像电脑的USB接口,不需要知道插入的是光盘、数据线或者其他,即接口隐藏了实际功能,但是通过声明有了统一的操作界面和使用方式。

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

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

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

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

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

201521123065 《Java程序设计》第5周学习总结

201521123065 《Java程序设计》第5周学习总结

public class Test {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
Shoppingcart cart = new Shoppingcart();
Product[] p = new Product[3];
p[0] = new Product("算法导论", 99.8, 3);
p[1] = new Product("java程序设计", 45.6, 10);
p[2] = new Product("杀死一只知更鸟", 20.6, 1);
Menu m=new Menu();
m.menu(cart, p); }
}
public class Shoppingcart {
ArrayList<Product> prolist = new ArrayList<Product>();
public void addpro(Product pro){
prolist.add(pro);
}
public void printlist(){
System.out.println(prolist);
}
public double calprice(){
double totalprice=0;
for (int i = 0; i < prolist.size(); i++) {
totalprice+=prolist.get(i).price*prolist.get(i).num;
}
return totalprice;
} }
public void menu(Shoppingcart cart, Product[] p) {
System.out.println("1、商品信息:");
System.out.println("2、购物车:");
switch (sc.nextInt()) {
case 1: {
System.out.println(Arrays.toString(p));
System.out.println("选择添加商品序号:");
switch (sc.nextInt()) {
case 1: {
cart.addpro(p[0]); }
case 2: {
cart.addpro(p[1]);
break;
}
case 3: {
cart.addpro(p[2]);
break;
}
}
menu(cart, p);
} case 2: {
if (cart.prolist.isEmpty())
System.out.println("您的购物车是空的哦!");
else { System.out.println("结算总计:");
cart.printlist();
break; }
menu(cart, p);
}
}
}
public class Product {
String name;
double price;
int num;
public Product(String name,double price,int num){
this.name=name;
this.price=price;
this.num=num;
}
}
public interface Print {
public void print(String string);
public String next();
public int nextint();
}

运行结果:

201521123065 《Java程序设计》第5周学习总结

|学生A|学生B|项目地址|

|:--------|:---------|

|http://www.cnblogs.com/zxl3066|http://www.cnblogs.com/201521123065hyw|

3. 码云上代码提交记录及PTA实验总结

3.1. 码云代码提交记录

201521123065 《Java程序设计》第5周学习总结

3.2. PTA实验

T1:几个类写在一个文件时,PersonSortable类要放于主函数类外。
T2:使用Arrays.sort进行排序的元素都要实现comparable接口;使用接口不需要考虑实现接口的类之间的层次关系。
大作业:初接触接口要特别注意static的使用与否,函数中方法定义static类型,外部同样也要使用static。盲目的跟着报错的提示改错会越改越多。