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

1. 本周学习总结

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

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

  • 接口
    • 接口(interface)就是方法声明和常量值的集合
    • 实现接口的类叫接口的实现类
    • 只包含常量和方法的声明,而无方法的实现
  • Comparable接口
    • 定义
public interface Comparable{
		int compareTo(Object other);
	}
- Comparable接口抽象出了比较的共同特性
- String实现了Comparable接口

2. 书面作业

阅读:Child压缩包内源代码

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

答:不能通过。
错误:

原因:在Parent类中,i是private(私有的),外部不能对其进行访问,因此无法编译成功。

解决方法:将private改为protected。
分析结果:c.getParenti();与父类无关,得到 1;c.getParentj();有四个输出,首先 System.out.println(super.j);继承父类得到 2;然后输出System.out.println(j);,与父类无关,得到 2;再输出 System.out.println(geti());,与父类无关,得到 1;最后 System.out.println(super.geti());super继承父类得到 1;Other.showParentSystem.out.println(p.j);有两个输出,System.out.println(p.j);从parent中得 2; System.out.println(p.geti());从parent中得 1;所以得到结果为:1 2 2 1 1 2 1

分析结果与运行结果一致。

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

答:不能通过。
提示:The type Parent is not visible,即Parent类无法访问。
原因:Parent类没有加上类似public,private关键词,所以会被默认只能在包内被访问,然而OutOfParentPackage在包外,无法对其进行访问
解决方法:让Parent类变成可以外部访问,即加上public;另外,System.out.println(p.j);中的j也无法被访问,因为j属于protected,不允许在包外对其进行访问,因此,还要将其改为public。

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

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

答:改造前的代码只能在控制台进行输入和输出操作,而改造后的代码可以在控制台,对话框以及图形界面等进行输入输出操作,很明显,这样改造使得代码的运行环境有更多的选择性,不再只是单调的由控制台进行操作,使用抽象类,抽象方法能使代码根据不同的运行环境满足不同的需求。
以下是代码中使用抽象类的部分:

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

答:将该游戏改造成图形界面那就意味着要在图形界面进行输入输出的操作,或许可以设一个输入输出类继承自抽象类的输入输出,然后将其定义覆盖为在图形界面进行输入输出。

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

答:抽象类只有声明,没有具体的方法,因此可以根据不同的需求进行调整。当我们在实验前无法提前得知代码的运行环境时,使用抽象类无疑是最好的选择。

实际上抽象类的获取有点像数学中的提取公因式:ax+bx+cx,x就是抽象类,如果你没有前面的式子,你怎么知道x是不是公因式呢?在这点上,也符合人们认识世界的过程,先具体后抽象。因此在设计过程中如果你得到大量的具体概念并从当中找到其共性时,这个共性的集合就是抽象类应当是没错的。
--[参考链接](http://www.cnblogs.com/rudyshen/archive/2008/04/05/1138689.html)

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

答:在这个例子中变化的是输入输出的环境(可以通过控制台,对话框,图形界面等),不变的是对输入输出进行抽象类定义(不需要撰写{},直接;结束即可)。类中如果存在没有任何操作的方法,并且表示为abstract,表示这个类定义不完整,不能用来生成实例,就好比不完整的设计图不能用来生产成品一样。子类如果继承抽象类,可以将子类也定义为抽象类,也可以操作抽象方法。

Comparable与Comparator##

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

答:Comparable接口实现他的每个对象进行整体的排序,它具有CompareTo的方法(进行自然比较)。一个类实现了Comparable接口,说明它的实例具有内在的排序关系,教材上说到实现Comparable接口后就可以跟多种泛型算法以及依赖于该接口的集合实现进行协作。所以可以直接使用Arrays.sort对其进行排序。

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

答:Comparable接口和Comparator接口,两个都是用来实现集合中元素的比较、排序的。Comparable是在集合内部定义的方法实现的排序,Comparator是在集合外部实现的排序,Comparable接口是一个对象本身已经支持自比较所需要实现的接口。Comparator是一个另写一个外部类来实现的比较的接口。

面向接口案例分析:阅读Case-StudentDao.zip案例

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

答:类关系图如下

Student是一个关于名字属性的类。StudentDao接口中有writeStudent和readStudent以及diplayAllStudent方法。StudentDaoArrayImpl是对StudentDao接口的操作,其中含有Student readStudent和boolean writeStuden以及void diplayAllStudent()等方法。StudenDaoListImpl是对StudentDao接口的另一个操作,包含Student readStudent(String name) 和boolean writeStudent(Student student) 以及void diplayAllStudent()等方法。

4.2 StudenDaoListImpl与StudentDaoArrayImpl有何区别?

答:StudenDaoListImpl是用ArrayList实现的,数组的大小可以随student的增加而动态改变;而StudentDaoArrayImpl是用数组实现的,数组的大小固定为80,。

5.什么是面向接口编程?面向接口编程的好处是什么?结合题目3与4中的Test.java的代码讨论分析。不要百度原封不动照搬!

答:接口主要的就是方法的声明,它允许操作这个接口的类拥有这些方法,就像Comparable接口允许所有操作它的类都具有可以比较的能力。但是接口显然不满足is a的关系,而是满足has-a的关系,就像bird与plain都有fly的能来,所以bird与plain都能实现fly接口。面向接口编程就是利用共同的行为而实现自同一个接口,这样可以使得代码更简洁,条理更清晰,还能增加代码的可读性。

在系统分析和架构中,分清层次和依赖关系,每个层次不是直接向其上层提供服务(即不是直接实例化在上层中),而是通过定义一组接口,仅向上层暴露其接口功能,上层对于下层仅仅是接口依赖,而不依赖具体类。

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

内容:使用Java代码完成上周做的面向对象设计大作业,需要有初步界面。实现的功能尽量简单,少而精,只包含必要的功能,不要追求高大全。
写出:类图(尽量精简,不用太多子类,两个即可)、系统常用功能描述、关键代码与界面
形式: 两人依托码云合作完成。请在这里贴出你们的学号、姓名与任务分工。
注意: 再过几次课要讲Java图形界面编程,到时候要将该系统升级为图形界面。系统的业务逻辑部分应该变化不大,变化大的是输入与输出部分。所以编码的时候,输入(Scanner)与输出(System.out)的代码,请不要将其与某个业务处理函数绑死。
选做加分: 给出两人在码云上同一项目的提交记录截图,额外加分。注:两个人在码云上新建一个项目。
参考资料:
结对编程参考资料
可以使用Processon画图

第6题提交作业的结构:
6.1

林艺如 项目地址
http://www.cnblogs.com/dabaolyr/p/6597914.html https://git.oschina.net/dabao_lyr/JavaLearn.git

6.2 常用功能描述框架图

6.3 关键代码

答:毕竟跟成绩挂钩,我的能力比较不足,就不耽误别人,我以购物车(主要以书籍为例)编了一些代码,主函数略长就没放,关键代码如下:

//商品类
class Product {
	public String name;
	public double price;
	public int num;

	public Product(String name, double price, int num) {
		super();
		this.name = name;
		this.price = price;
		this.num = num;
	}

	public double getPrice() {
		return price;
	}

	public void setPrice(double price) {
		this.price = price;
	}

	public int getNum() {
		return num;
	}

	public void setNum(int num) {
		this.num = num;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@Override
	public String toString() {
		return "Product [price=" + price + ", num=" + num + ", name=" + name + "]";
	}
}
//购物车类
class ShoppingCart extends Product {
	private int nums;// 购买数量

	public ShoppingCart(String name, double price, int num, int nums) {
		super(name, price, num);
		this.nums = nums;
	}

	@Override
	public String toString() {
		return "[购物车    商品名称:" + name + ",价格:" + price + ", 购买数量" + nums + "]   ";
	}

	ArrayList<ShoppingCart> carts = new ArrayList<ShoppingCart>();

	public boolean writeCart(ShoppingCart cart) {
		carts.add(cart);
		return true;
	}

	public int getNums() {
		return nums;
	}

	public void setNums(int nums) {
		this.nums = nums;
	}

	public double sumprice() {
		double sum = 0.0;
		for (ShoppingCart e : carts) {
			sum += e.getPrice() * e.getNums();
		}
		return sum;
	}
}
//书籍类
class Book extends Product {
	private String author;
	private String isbn;

	public String getAuthor() {
		return author;
	}

	public void setAuthor(String author) {
		this.author = author;
	}

	public String getIsbn() {
		return isbn;
	}

	public void setIsbn(String isbn) {
		this.isbn = isbn;
	}

	public Book(String name, double price, int num, String author, String isbn) {
		super(name, price, num);
		this.author = author;
		this.isbn = isbn;
	}

	@Override
	public String toString() {
		return "书名:" + name + ",作者:" + author + ", ISBN:" + isbn + ",价格:" + price + ",库存:" + num;
	}
}
//用数组保存书籍代替数据库
Book[] books = new Book[3];
    books[0] = new Book("java", 100, 100, "a", "123");
    books[1] = new Book("c++", 50, 50, "b", "456");
    books[2] = new Book("php", 60, 60, "c", "789");

6.4 运行界面

答:代码运行界面如下:

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

题目集:jmu-Java-04-面向对象2-进阶-多态接口内部类

3.1. 码云代码提交记录

在码云的项目中,依次选择“统计-Commits历史-设置时间段”, 然后搜索并截图

3.2. PTA实验

继续完成前面未完成的实验面向对象1-基础-封装继承
函数(选做:4-1)、编程(5-1, 5-2)
一定要有实验总结

5-1:题目要求比较name和age进行升序排列,那么重点就在于比较,只要采用实现Comparable接口,然后重写compareTo()方法就可以,之后直接使用Arrays.Sort进行排序即可,因为题目是升序,因此可以使用return this.getage-o.getage;若题目是降序,则需要用其他方法,否则会出错。

5-2:这题直接用comparator接口来实现,定义两个方法都implements comparator,分别对name和age进行比较排序,因为Comparable接口只能对实现类进行比较,而comparator可以对外部类进行比较,只要覆盖compare()方法就好,最后使用Arrays.Sort进行排序,而本题中使用Arrays.sort(ps,new NameComparator());Arrays.sort(ps,new AgeComparator());进行排序,其中ps是PersomSortable2类型的数组。

原文地址:https://www.cnblogs.com/dabaolyr/p/6597914.html