java第五次作业
1. 本周学习总结
2. 书面作业
1.代码阅读:Child压缩包内源代码
//child
public 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());
}
}
//parent
class Parent{
private int i=1;
protected int j=2;
protected int geti(){
return i;
}
public void getj(){
System.out.println(j);
}
}
//other
class Other{
public static void showParentj(Parent p){
System.out.println(p.j);
System.out.println(p.geti());
}
}
//OutOfParentPackage
import 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<T>接 口。
因为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接口是一系列方法的声明,是一些方法特征的集合。
-一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为。
-通过实现接口,达到将功能抽象化的作用,便于程序设计与维护。
-本次实验更加清楚的知道了三种定义类型的继承范围。