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

2. 书面作业

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

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

错误 纠正 分析
System.out.println(i) 可将定义i的权限改为protected或public i是被private定义的,不可调用

输出结果为:1 2 2 1 2 1

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

错误 纠正 分析
showParentj(Parent p) 将parent改为public属性 parent这个类不是public权限,因此只能在同一个包中调用
p.j or p.geti() 最好把变量改private,为其设置public的getter和setter,不要直接调用这个变量,只调用getter和setter 即使parent是public,这两个也不可以调用,因为protect修饰的只允许同一个包或者不同包的子类调用

1.3 回答:如果为了访问到protected修饰的属性或方法应该怎么办?

答:同一个包中,子类可访问,不在同一个包中,只能通过子类的引用。因为protected修饰的属性或方法只允许同一个包或者不同包的子类调用。


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

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

答:改造后程序灵活性大,更加满足实际需求,改造前只能在控制台输出,改造后,使用抽象类,可以在控制台,也可以使用对话框图形界面等输入,实现方式增加。

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

答:设计一个图形界面并进行继承之前规定好的抽象类,将抽象方法进行重写

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

答:在一些项目中需要多人合作的情况下,每个人完成自己的部分,最后在整合一起。负责前期项目框架搭建的人这时就可以先用abstract先定义好一些方法,具体实现方法的内容交给其他人来做。

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

答:变化的有,输入输出的值,界面,控制台等,不变的是abstract定义的抽象类,抽象方法,都需要一个子类去继承,实现它们。


Q3.Comparable与Comparator

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

答:Comparable接口可以抽象出需要比较的类之间的共同特性,具体体现在都要拥有compareTo方法,及拥有共同的行为

所有实现Comparable的对象都有一个共同的特性-可以被比较,具体体现在均拥有compareTo方法, 即拥有共同的行为!

实现Comparable接口后,Arrays.sort就可对基本数值类型数组进行排序

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

答:即使两个对象没有实现Comparable接口,也可以比较。只需要在具体比较的属性时用Comparator接口就行,可以省略很多代码,更加简便。


Q4.面向接口案例分析

阅读Case-StudentDao.zip案例
4.1 画出类关系图,描述每个类与接口的作用。

  • StudentDao(interface):提供三个抽象方法,写入学生数据、读取学生数据和显示所有学生信息。对于写入学生数据,通过一个boolean变量来判断是否写入成功。
  • StudentDaoArrayImpl类:用数组来存放学生信息,具体实现接口的三个抽象方法,读取学生信息,如果找不到返回null;如果遍历整个数组,没找到学生信息返回false。显示所有学生信息则要求对象都是非空的。
  • StudenDaoListImpl类:用列表来存放学生信息,具体实现接口的三个抽象方法。

4.2 StudenDaoListImpl与StudentDaoArrayImpl有何区别?

答:StudenDaoListImpl是用ArrayList实现的,而StudentDaoArrayImpl是用数组实现的。


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

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

面向接口编程:

所谓面向接口编程,就是代码与接口相关联的(比如Comparable接口),而不需要考虑具体的实现类。
只要某个类(如Employee)实现了相关的接口(如Comparable),我们编写的面向接口(如Comparable)的代码就可以适用。

好处:

面向接口编程可以将接口与实现相分离,从而大大提高程序的灵活性

public class Test {

	/**
	 * @param args
	 */
	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 sdm = new StudentDaoArrayImpl(50);StudentDao sdm = new StudenDaoListImpl();无论哪一个被注释,另一个同样可以调用接口中所有方法。


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

3.1本周Commit历史截图

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

3.2 实验总结

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

答:
5-1:
基本操作就是PersonSortable实现Comparable接口,然后重写compareTo()方法。
遇到的难点是,编写compareTo()方法时遇到麻烦,其中对name的比较不能用“>”,“<”,“==”,而对age就能,我觉得可是因为name是String类型,而age为int类型。修改后代码为:

public int compareTo(PersonSortable s) {
		
			if (this.name.compareTo(s.name) == 0) {
				return this.age > s.age ? 1 : -1;
			}
			return this.name.compareTo(s.name);
		}
	

5-2:
基本与第一题类似,只不过是重写编写编写NameComparator类与AgeComparator类,分别实现对name和age进行升序排序,没遇到问题。
原先曾试过课堂上老师提过的匿名内部类方法编写,也可以成功输出,代码为:

 Arrays.sort(s, new Comparator<PersonSortable2>() {

 public int compare(PersonSortable2 arg0, PersonSortable2 arg1) {
 // TODO Auto-generated method stub
 return arg0.getName().compareTo(arg1.getName());
 }

 });
 for (PersonSortable2 t : s) {
 System.out.println(t);
 }
 
posted @ 2017-03-25 19:00  林健  阅读(250)  评论(0编辑  收藏  举报