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

1. 本周学习总结

1.1 写出你认为本周学习中比较重要的知识点关键词

接口多态抽象类interfaceimplementsinstanceof

1.2 尝试使用思维导图将这些关键词组织起来。注:思维导图一般不需要出现过多的字。


2. 书面作业

1. 面向对象设计大作业(团队项目,2-3人)

1.1 项目简介表格:

https://gitee.com/piraat/java201621123086/tree/master/shop

学生 负责任务 博客地址
张韵弢 cart类的编写 http://www.cnblogs.com/piraat/
王祖建 search类的编写 http://www.cnblogs.com/k-wzj/
黄泽鑫 lmenu类的编写 http://www.cnblogs.com/1613HZX/

1.2 系统常用功能框架图

1.3 系统总体类图

1.4 购物车、商品、系统关键代码截图(主要截取自己负责的部分)

package shop;

import java.util.ArrayList;

public class Cart {

	class Commodit{
		private Goods goods;
		private int num;
		
		public Commodit(Goods g , int n){
			this.goods = g;
			this.num = n;
		}
		
		public double goodsfee(){
			return this.goods.price*this.num;
		}
	}
	
	private ArrayList<Commodit> list = new ArrayList<Commodit>();
	
	public boolean add(Goods goods, int n){
		Commodit temp = new Commodit(goods, n);
		if(list.contains(goods)){        //待实验
			int i = list.indexOf(goods); //待实验
			temp.num += list.get(i).num;
			list.set(i, temp);
			return true;
		}
	    else{
	    	list.add(temp);
	    	return true;
	    }
		
	}
	
	public boolean delete(Goods goods, int n) {
		Commodit temp = new Commodit(goods, n);
	    if(list.contains(goods)){      //待实验
	    	int i = list.indexOf(goods);   //待实验
	    	if(list.get(i).num < n)
	    		return false;
	    	else if(list.get(i).num == n){
	    		list.remove(list.get(i));
		    	return true;
	    	}
	    	else if(list.get(i).num > n){
	    		temp.num = list.get(i).num - n;
	    		list.set(i, temp);
		    	return true;
	    	}
	    }
		return false;  
	}
	
	public boolean clear(){
		if(list.isEmpty())
			return false;
		else{
			list.clear();
			return true;
		}
	}
	
	public void purchase(){
		Console io = new Console();
	    for (Commodit item : list) {
	        io.outstr("确认购买" + item.goods + "共, " + item.num + "件");
	    }
	    
	    io.outstr("合计" + total(list) + "元");
	}
	
	
	public void displayAll() {
	    Console io = new Console();
		if (list.isEmpty()) {
	        io .outstr("购物车是空的");
	    } else {
	        for (int i = 0; i < list.size(); i++) {
	            io.outstr(i + 1 + ". " + list.get(i).toString());
	        }
	        io.outstr("合计:" + total(list) + "元");
	    }
	    
	}
	
	public double total(ArrayList<Commodit> goodslist){
		double sum=0.00;
		for(int i =0 ; i < goodslist.size(); i++){
			sum += goodslist.get(i).goodsfee();
		}
		return sum;
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
	
	}

}

1.5 其他:跟上次的系统比较,系统的设计等有何修改。其他感想。

跟上次的系统相比,此次添加的是adddeletepurchase等基本功能,使用arraylist对商品进行增加与删除。然而,使用过程中,作为Commodit类型的Arraylist可否可以使用contains函数对goods类型进行查询还未试验过,eclipse并未对此报错,但能否使用还有待实验。
还有就是Search作为接口的实验,此次还是讲Search接口完成为一个类,今后会实验将其作为接口完成在各个类中的可能性。

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

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

  • 抽象类从面向对象编程的角度来说,增加了代码的复用性,便于将来的继承、多态的实现,使得代码的效率提高,提升可读性。
  • 从此程序来看,文件中只写了核心猜数字的部分,留下了抽象方法。开发人员可以在将来对于这些方法进行继承编写,提升了可移植性和灵活性。程序无需在现在对于输入输出方法进行规定,而可以在将来灵活改变。

2.2 GuessGame(改造后).java中有抽象方法与非抽象方法,你觉得抽象类中什么样的方法应该声明为abstract,什么方法不需要声明为abstract直接实现即可。

  • 声明为abstract的方法应该是非具体的、抽象的方法。这些方法暂时还没有具体的实现要求。例如public abstract void print(String text);在将来可能会进行更改时,我们将其定义为抽象方法。
  • 声明为abstract的方法有可能是为了利于未来编写代码的复用。例如有多个方法继承一个抽象方法,而继承的方法通常有相同特性或目的。
  • 不需要声明为abstract的方法主要是那些不需要在将来进行更改或复用的,可以在编写过程中就定义好的方法。

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

直观 上来看:
变化的是输入输出的方式; 将具体的输入方式guess = scanner.nextInt();改为了抽象方法public abstract int nextInt();
不变的是核心实现方式

	int number = (int) (Math.random() * 10); 
        int guess;
        do {
            print("输入数字:");
            guess = nextInt();
        } while(guess != number);

面向对象编程 的角度看:
变化的是代码通过定义抽象类,提升了程序的复用性、灵活性。
通过abstract来定义方法,可以让开发人员在将来易于对系统进行维护
同时也提升了程序的可移植性,使得在对输入输出方法做出改变的时候不需要对整个程序进行修改。

3. Comparable与Comparator

3.1 结合PTA 7-1中你的代码说明,为什么某个类实现了Comparable接口,就可以直接使用Arrays.sort对该类型的数组进行排序?

因为Comparable作为接口写在了JAVA的包里面,而我们只需通过implements完成此接口,就可以令Arrays.sort调用此方法。反之,若没有完成此接口,则无法调用此方法,Arrays.sort同样无法使用。

在7-1中可以看到,通过完成Comparable方法使得main方法中可以调用Arrays.sort

3.2 结合PTA 7-2 中你的代码说明,有了Comparable接口为什么还需要Comparator接口呢?

Coparable接口可以实现按照特定的顺序进行排序的任务,而Comparator接口可以使得Arrays.sort方法按照不同方式进行排序

例如图中根据nameage的顺序进行排序的两种方法

3.3 以前的作业Shape, Rectangle,Cirlce中,Shape类中什么方法应声明为abstract?说出原因。

public int getPerimeter()
public double getArea()
应该声明为abstract

原因在于Shape作为父类,其中的方法public int getPerimeter()public double getArea()的实现是无法在父类中确定的,不同的形状会有不同的求周长域面积的方法。
所以上述方法应该在Shape类中声明为abstract

3.4 有很多Shape类型对象如Rectangle、Circle。希望使用Arrays.sort对他们进行排序,请写出相应代码。并简述应在哪个类上实现Comparable接口比较好?

abstract class Shape implements Comparable<Shape>{

    final double PI = 3.14;
    public abstract double getPerimeter();

    public abstract double getArea();
    
    public int compareTo(Shape t){
    	if (this.getArea() > t.getArea())
    		return 1;
    	else if(this.getArea() == t.getArea())
    		return 0;
    	else 
    		return -1;
    }
}

应该在父类Shape上实现比较好,因为排序针对的是所有形状的图形。

3.5 以3.4你编写的代码为例,简述面向Comparable接口编程、面向父类编程的好处。(注意:一定要结合自己编写的代码)

面向Comparable接口编程,使得程序员在编写代码时的工作简化了很多。不需要完成整个排序部分,只需要自己通过implements接口,编写排序顺序,就可以完成Arrays.sort方法。在3.4中,按照面积的大小进行排序,只需要编写compareTo方法,对this.getArea()与引进的参数的面积进行比较就可以完成排序。
简化工作过程,同时也使代码标准化了许多。

面向父类编程,则提高了代码的复用性与规范性。
圆与长方形同为形状,所以他们可以通过继承父类形状来完成面积与周长的方法。

4. 面向接口案例分析

4.1 a.画出类关系图。b.StudentDao接口有什么用?

a.

b.通过定义StudentDao接口定义了三个方法public boolean writeStudent(Student student);来写入学生信息;public Student readStudent(String name);来读取学生public void diplayAllStudent();来展示所有学生。便于将来开发人员对于系统的完善与移植。

4.2 StudenDaoListImpl与StudentDaoArrayImpl有何共同之处?有何区别?

共同之处: 都完成了接口的方法
区别:StudenDaoListImpl使用了ArrayList,操作更为灵活,明显缩短了代码长度,但速度较慢。也使用了Student e:students更为健壮的写法
StudentDaoArrayImpl使用传统的数组,数组长度固定。

4.3 结合Test.java中的main函数,简述面向接口编程的好处。

可以在不考虑具体实现的情况下完成其他代码部分的编写。例如Test.java文件中,在不考虑具体实现的情况下调用了接口StudentDao sdm = new StudentDaoArrayImpl(50);,直接调用了接口的函数,而无需考虑对于sdm.readStudentsdm.writeStudent的具体编写。
程序更为简洁规范,同时为程序员提供了便利,符合多态的要求。

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

面向接口编程,在我看来就是为程序提供一个完全抽象的、还未实现的类。这么做的目的或许是,具体的实现还未完成,也可能是实现方法多种多样,需要提高可移植性以便在将来更换实现方法。
例如在Test.java中,我们可以在完全不考虑public boolean writeStudent(Student student);实现平台、实现方法的情况下直接调用这个方法。也可以在将来更换这个方法的具体实现,而不需要对Test.java进行任何更改。
而这样做的好处在于:

  • 我们可以更换接口的实现方法,编写可复用性更好的代码
  • 可以为编写人员提供方便,在程序员还无法确定具体实现方法的时候,先保留接口来进行其他代码的编写

3.码云及PTA

3.1. 码云代码提交记录

3.2 截图PTA题集完成情况图


3.3 统计本周完成的代码量

周次 总代码量 新增代码量 总文件数 新增文件数
1 0 0 0 0
2 0 0 0 0
3 619 619 15 15
4 619 0 15 0
5 973 354 25 10
6 1394 421 37 12
posted @ 2017-10-19 15:21  pirrat  阅读(385)  评论(2编辑  收藏  举报