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类里面,我们只要关心数据到底是以何种数据结构来存放,不需要管具体的底层实现。用列表,数组都可以
    实现写入学生数据、读取学生数据和遍历学生信息的操作。
    当我不知道要以什么方式排序,只知道需要有排序功能时,那么我就必须使用接口告诉编译器,我这个类具有排序的功能。
    但是具体实现未知,具体实现之后再写。面向接口编程就是说我有这个功能,但是具体实现不知道,
    在设计时必须要考虑到各种功能,但是却不需要每一个都具体写出来,在做项目时让逻辑更清晰明白。
  1. 码云上代码提交记录及PTA实验总结

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

3.2. PTA实验

-Java接口是一系列方法的声明,是一些方法特征的集合。
-一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为。
-通过实现接口,达到将功能抽象化的作用,便于程序设计与维护。
-本次实验更加清楚的知道了三种定义类型的继承范围。
posted @ 2017-03-25 17:30  lsl321  阅读(231)  评论(0编辑  收藏  举报