1. 本周学习总结
2. 书面作业
1.代码阅读:Child压缩包内源代码
//childpublic class test extends Parent{ public static void main(String[] args){ Parent p = new Parent(); Child c = new Child(); c.getParenti(); c.getParentj(); Other.showParentj(p); } public void getParenti(){ System.out.println(i); } public void getParentj(){ System.out.println(super.j); System.out.println(j); System.out.println(geti()); System.out.println(super.geti()); }}//parentclass Parent{ private int i=1; protected int j=2; protected int geti(){ return i; } public void getj(){ System.out.println(j); }}//otherclass Other{ public static void showParentj(Parent p){ System.out.println(p.j); System.out.println(p.geti()); } }//OutOfParentPackageimport com.parent.*;public class OutOfParentPackage{ public static void showParentj(Parent p){ System.out.println(p.j); System.out.println(p.geti()); p.getj(); }}
1.1 com.parent包中Child.java文件能否编译通过?哪句会出现错误?试改正该错误。并分析输出结果。
答:错的是 System.out.println(i);将private改成protected就可以了。 分析:因为clild没有重新定义i和j的值,所以只用之用输出父类中的值,且加上super的方法名就是使用父类的方法,其余按照程序运行输出就可以了。
运行结果
1.2 另外一个包中的OutOfParentPackage.java,能否编译通过?提示什么错误?分析原因。
答;编译出现了错误,` public static void showParentj(Parent p)`出现了错误,原因是找不到Parent。因为geti()的方法是protected的,所以外部无法访问,所以吧parent中的所有方法名和变量类型都设成public就可以了。
2.abstract进阶:阅读GuessGame抽象类的设计与使用源代码
//改造前package cc.openhome;import java.util.Scanner;public class Guess { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int number = (int) (Math.random() * 10); int guess; do { System.out.print("猜数字(0 ~ 9):"); guess = scanner.nextInt(); } while(guess != number); System.out.println("猜中了...XD"); }}//改造后package cc.openhome;public abstract class GuessGame { public void go() { int number = (int) (Math.random() * 10); int guess; do { print("输入数字:"); guess = nextInt(); } while(guess != number); println("猜中了"); } public abstract void print(String text); public abstract void println(String text); public abstract int nextInt();}
2.1 Guess改造前代码很简单,而改造后的代码使用了抽象类、抽象方法看起来很复杂,那这样的改造到底有什么好处呢?
改造前,未使用抽象类,只能控制台输出改造后,使用抽象类,可以在控制台,也可以使用对话框图形界面等输入
2.2 如果想将该游戏改造成图形界面,应该进行一些什么操作?
答:设计一个图形界面猜数字的类去继承上文提到的抽象类,然后用图形界面支持的输入输出语句来重写抽象类当中的抽象方法。
2.3 结合该例子,你觉得什么时候应该使用abstract?
1.当父类不知道子类的方法实现方式时,可以用abstract。2.当有多个子类继承该方法,且实现方法不同时,可以用抽象类,有点像多态。
2.4 重要:在这个例子中,变化的是什么,不变的是什么?尝试结合abstract、继承等概念进行说明。
答:变化的是控制台输入方法,不变的是方法实现的结果都一样。 abstract是一种抽象方法,他没有具体的实现及输入输出的方式,所以需要继承该方法,并且给出实现的具体方式,否则抽象类是没有任何意义的。要有一个非抽象类的类去继承它才可以。
3.Comparable与Comparator
3.1 描述Comparable接口的用途。为什么某个类实现了Comparable接口就可以直接使用Arrays.sort对其进行排序?
答:Comparable接口将比较代码嵌入自身类中。在开发中我们可能会遇到需要将一些对象有序的放入到集合中,这时候我们只需要让类实现java.lang.Comparable接 口。 因为Comparable接口只有`public int compareTo(T o);`一个方法,所以覆盖compareTo这个方法即可实现自动排序,这样就不用自己写一个排序的方法。
3.2 有了Comparable接口为什么还需要Comparator接口呢?
答:因为comparable接口是一个内比较器,是强制排序的那种。但是我们实际运用中可能想要通过不同类型的比较方式去排序,所以就需要comparator,因为他是可以选择排序方式的。
4.面对接口案例分析
阅读Case-StudentDao.zip案例
4.1 画出类关系图,描述每个类与接口的作用。
4.2 StudenDaoListImpl与StudentDaoArrayImpl有何区别?
答:StudenDaoListImpl与StudentDaoArrayImpl各自的私有属性不同,即实现的数据结构不一样,StudenDaoListImpl是用ArrayList实现的,而StudentDaoArrayImpl是用数组 实现的。所以两个类对于接口的抽象方法相同但是有不同的实现。两个类具体的方法是两种不同的。
5.什么是面向接口编程?面向接口编程的好处是什么?
面向接口编程关注的是不同的类是否有共同的方法,不关心对象本身。 题目3用到Comparable和Comparator两个接口,通过这两个接口,我们可以很方便地对自己定义的类进行比较,从而调用Arrays里面已经写好的sort()方法来排序。 这个过程相当于面向接口编程。题目4也是如此,在Test类里面,我们只要关心数据到底是以何种数据结构来存放,不需要管具体的底层实现。用列表,数组都可以 实现写入学生数据、读取学生数据和遍历学生信息的操作。 当我不知道要以什么方式排序,只知道需要有排序功能时,那么我就必须使用接口告诉编译器,我这个类具有排序的功能。 但是具体实现未知,具体实现之后再写。面向接口编程就是说我有这个功能,但是具体实现不知道, 在设计时必须要考虑到各种功能,但是却不需要每一个都具体写出来,在做项目时让逻辑更清晰明白。
- 码云上代码提交记录及PTA实验总结
3.1. 码云代码提交记录
在码云的项目中,依次选择“统计-Commits历史-设置时间段”, 然后搜索并截图3.2. PTA实验
-Java接口是一系列方法的声明,是一些方法特征的集合。-一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为。-通过实现接口,达到将功能抽象化的作用,便于程序设计与维护。-本次实验更加清楚的知道了三种定义类型的继承范围。