201521123038 《Java程序设计》 第五周学习总结


1. 本周学习总结

2. 书面作业

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

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

package com.parent;

public class Child 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); //输出父类i
}
public void getParentj(){
System.out.println(super.j); //输出父类j
System.out.println(j); //输出父类j
System.out.println(geti()); //输出父类i
System.out.println(super.geti()); //输出父类i
}
}

package com.parent; class Other{ public static void showParentj(Parent p){
System.out.println(p.j); //输出父类j
System.out.println(p.geti()); //输出父类i
} }
package com.parent;

class Parent{

    private int i=1;
protected int j=2;
protected int geti(){
return i;
}
public void getj(){
System.out.println(j);
}
}

不能编译通过。出错语句:System.out.println(i)。提示错误:The field Parent.i is not visible.意思是Parent.i不可见。通过父类Parent代码可以得知i被private修饰,对子类不可见。所以可以将private改成protected。

修改后的输出结果:

1

2

2

1

1

2

1

为了方便解释已把输出注释在源代码上。

1.2 另外一个包中的OutOfParentPackage.java,能否编译通过?提示什么错误?分析原因。如何更改才能使之正常编译?

import com.parent.*;

public class OutOfParentPackage{

	public static void showParentj(Parent p){
System.out.println(p.j);
System.out.println(p.geti());
p.getj();
}
}

不能通过编译。Parent p提示错误:The type Parent is not visible。意思是Parent不可见。因为OutOfParentPackage.java和Parent.java分别在两个不同的包中,而Parent前没有修饰词,所以暂时无法访问。所以要将Parent.java中Parent类前加上public,使其可以被外部访问。同时也要将j和geti的修饰改成public。因为被protected修饰的变量或者方法不能被其他包访问到。

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

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

改造前:

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.2 如果想将该游戏改造成图形界面,应该进行一些什么操作?

首先需要一个可以实现图形界面的类来支持这个游戏的整体框架,其次这个界面类要继承题目给出的抽象类通过重写来实现。

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

一个方法暂未定义执行方法的时候可以用abstract,比如输入输出方法,再没确定执行方法时可以先使用抽象类。如果需要实现则需要子类来继承覆盖,也就是说抽象方法必须在子类中实现。

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

不变的是抽象方法,变的是该方法的实现方式。在这个例子中不变的是输入输出,变的是输入输出的实现方式,可以是控制台也可以是对话框图形界面。

尝试解释:从前面学习的知识可以得知,采用abstract修饰的方法是抽象方法,不能实例化,一般定义在父类中。比如之前编写的代码中的Shape类中的getArea方法,因为Shape包括很多子类,比如Circle和Rectangle类都继承Shape类,这两个图形求Area的方法不一样,不能在父类Shape中统一定义。所以需要在父类中定义一个抽象的方法getArea。而在子类Circle和Rectangle中,都需要对getArea重写,也就是在子类中实现父类中 的抽象方法。

3.Comparable与Comparator

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

Comparable接口是用来实现对实现它的某个类的对象进行整体排序。实现方法中调用了compareTo,通过比较对象的大小来确定返回值从而实现排序。

这里粘贴一段关于Arrays中排序的源代码:

由这段代码可以得知,使用Arrays.sort最终需要使用Comparable接口,所以某个类要使用Arrays.sort则必须实现Comparable接口,否则无法实现排序。

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

首先要明确一下两者是不一样的,Comparator位于包java.util下,而Comparable位于包java.lang下。两者虽然都是用来排序,实现方法也是有区别的。当一个类没有实现Comparable接口的时候也可以通过Comparator来实现排序。

4.面向接口案例分析

阅读Case-StudentDao.zip案例

4.1 画出类关系图,描述每个类与接口的作用。

  • Student类:属性为name。重写方法toString
  • StudentDao接口:三个抽象方法:写入学生信息,读取学生信息,输出学生信息
  • StudentDaoArrayImpl类:实现StudentDao中的三个抽象方法,同时定义Student数组来存储学生信息
  • StudenDaoListImpl类:实现StudentDao中的三个抽象方法,采用ArrayList存储相关信息

4.2 StudenDaoListImpl与StudentDaoArrayImpl有何区别?

StudenDaoListImpl与StudentDaoArrayImpl的作用都是具体实现StudentDao中的三个抽象方法,但是实现的方式不同。StudentDaoArrayImpl是通过数组来实现,StudenDaoListImpl是通过ArrayList来实现。

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

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

题目3中为实现比较用到两个接口,分别为Comparable和Comparator。某个类实现了Comparable接口就可以直接使用Arrays.sort对其进行排序;Comparator则可以对某个类中指定的两个元素进行比较。

题目4中的Test.java用的是数组或是列表来实现学生信息的管理。在Test.java中向后台写入数据不需要考虑具体的后台,以为这里面向StudentDao接口,该接口中有对数据进行处理的方法。而实现某方法的具体操作在相关类中都有实现。

首先明确一下接口是什么,接口表面上是由一堆没有具体代码的方法组成,可以在其它类中具体实现这些功能。而实现该接口的类必须要实现这些功能(个人理解:跟子类继承父类则子类要实现父类中的抽象方法有点相似)。如果一个项目中已经有定义的接口,知道该接口包含功能,那么进行上层编程的时候可以直接使用这些功能,暂时不需要考虑下层的代码是如何实现这些功能的。比如题目4中可以采用数组或者列表来存储信息,那么在编写主程序的时候只需要调用这些功能,暂不用考虑这些功能如何实现,这就是面向接口编程。

从上面的分析可以看出,如果需要对接口功能的实现进行修改,那么只需要修改下层具体实现某功能的代码即可,不需要在主程序上大作改动,这样可以提高编写效率,增加代码的稳定性。

6.结对编程:面向对象设计(大作业2-非常重要)

内容:使用Java代码完成上周做的面向对象设计大作业,需要有初步界面。实现的功能尽量简单,少而精,只包含必要的功能,不要追求高大全。

写出:类图(尽量精简,不用太多子类,两个即可)、系统常用功能描述、关键代码与界面

形式: 两人依托码云合作完成。请在这里贴出你们的学号、姓名与任务分工。

注意: 再过几次课要讲Java图形界面编程,到时候要将该系统升级为图形界面。系统的业务逻辑部分应该变化不大,变化大的是输入与输出部分。所以编码的时候,输入(Scanner)与输出(System.out)的代码,请不要将其与某个业务处理函数绑死。

选做加分: 给出两人在码云上同一项目的提交记录截图,额外加分。注:两个人在码云上新建一个项目。

6.1

学生A 学生B 项目地址
游舒婷 杨晨露 http://git.oschina.net/sakurai3104/Shopping

6.2常用功能描述框架图



6.3关键代码

这里贴几个类的代码

Goods类:

public abstract class Goods {

	private String name;
private double price;
private String category;
int num; public int getNum() {
return num;
} public void setNum(int num) {
this.num = num;
} public String getCategory() {
return category;
} public void setCategory(String category) {
this.category = category;
} public Goods(String category,String name,double price,int num)
{
setCategory(category);
setName(name);
setPrice(price);
setNum(num);
} @Override
public String toString() {
return category+" 名称:" + name + " \t价格:" + price +" \t库存:"+num;
} public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
} }

Books类:

public class Books extends Goods{

	public Books(String category, String name,double price,int num) {
super(category, name, price,num); } @Override
public String toString() {
return super.getCategory()+" 名称:" + super.getName() + " \t价格:" + super.getPrice()+" \t库存:"+super.getNum();
} }

ShoppingCart类:

public class ShoppingCart extends Goods {

	private static int totalnum=0;
private static double totalprice=0;
private int cnum; public ShoppingCart(String category, String name, double price,int num,int cnum) {
super(category, name, price,num);
setCnum(cnum);
setTotalprice(cnum);
setTotalnum(cnum);
}
public int getNum() {
return cnum;
} public int getCnum() {
return cnum;
} public void setCnum(int cnum) {
this.cnum = cnum;
} public void setNum(int cnum) {
this.cnum = cnum;
} public int getTotalnum() {
return totalnum;
} public void setTotalnum(int cnum) {
this.totalnum = cnum+this.totalnum;
} public double getTotalprice() {
return totalprice;
} public void setTotalprice(int cnum) {
this.totalprice = cnum*this.getPrice()+this.totalprice;
} @Override
public String toString() {
return super.getCategory()+" 名称:" + super.getName() + " \t价格:" + super.getPrice() +" \t数量:"+cnum;
}
public static String total()
{
return "\t总价:"+totalprice+"\t\t总数:"+totalnum; } }

6.4运行界面

因为暂时没有办法用Eclipse写出像确认按钮这样方便的选择方法,所以用系统强硬地采用输入输出的方式来实现。有一部分功能还有待改进。

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

3.1. 码云代码提交记录

3.2.PTA实验

  • 1.可以用System.out.println(Arrays.toString(类名.class.getInterfaces()))来输出一个类中的接口,可以用来检查。
  • 2.面向接口编程,当程序要求简单的时候容易编出来,但是在程序要求多的时候容易混乱,在这方面的能力需要提高。

201521123038 《Java程序设计》 第五周学习总结的更多相关文章

  1. 201521123025<java程序设计>第五周学习总结

    1. 本周学习总结 2. 书面作业 1.代码阅读:Child压缩包内源代码 1.1 com.parent包中Child.java文件能否编译通过?哪句会出现错误?试改正该错误.并分析输出结果. 1.2 ...

  2. Java程序设计第五周学习总结

    1. 本周学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点. 1.2 可选:使用常规方法总结其他上课内容. 2. 书面作业 **代码阅读:Child压缩包内源代码 Child.java源代 ...

  3. 201521123038 《Java程序设计》 第二周学习总结

    201521123038 <Java程序设计> 第二周学习总结 1.本章学习总结 学会在Java程序中使用函数,使程序层次更清晰 使用StringBuilder编写代码,减少内存空间的占用 ...

  4. 201521123038 《Java程序设计》 第一周学习总结

    201521123038 <Java程序设计> 第一周学习总结 1.本章学习总结 本周已掌握Java配置,初步认识Java运行软件和基本语法. Java语言语法和C语言基本类似,部分不同. ...

  5. 201521123038 《Java程序设计》 第九周学习总结

    201521123038 <Java程序设计> 第九周学习总结 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 本次PTA作业题集异常 ...

  6. 20145213《Java程序设计》第九周学习总结

    20145213<Java程序设计>第九周学习总结 教材学习总结 "五一"假期过得太快,就像龙卷风.没有一点点防备,就与Java博客撞个满怀.在这个普天同庆的节日里,根 ...

  7. 21045308刘昊阳 《Java程序设计》第九周学习总结

    21045308刘昊阳 <Java程序设计>第九周学习总结 教材学习内容总结 第16章 整合数据库 16.1 JDBC入门 16.1.1 JDBC简介 数据库本身是个独立运行的应用程序 撰 ...

  8. 20145236 《Java程序设计》第九周学习总结

    20145236 <Java程序设计>第九周学习总结 教材学习内容总结 第十六章 整合数据库 JDBC简介 1.JDBC是java联机数据库的标准规范.它定义了一组标准类与接口,标准API ...

  9. 20155304田宜楠2006-2007-2 《Java程序设计》第一周学习总结

    20155304田宜楠2006-2007-2 <Java程序设计>第一周学习总结 教材学习内容总结 - 浏览教材,根据自己的理解每章提出一个问题 第一章 除了书上提到的开发工具还有什么适合 ...

  10. 20155303 2016-2017-2 《Java程序设计》第二周学习总结

    20155303 2016-2017-2 <Java程序设计>第二周学习总结 教材学习内容总结 『注意』 "//"为单行批注符: "/*"与&quo ...

随机推荐

  1. cornerstone 使用报错 working copy ... is too old(format 10 created by subversion 1.6)

    1.....本来正常使用的cornerstone 突然出现这个问题 图片如下 2....解决方案,,,,也搜集了方法,,但是最后竟然就这样解决了,,完全搞不懂的解决方案啊 如图 3......如有错误 ...

  2. 【平板电脑模拟器】PC端-Chrome自带的功能

    直接说使用方式吧, 启动方法:打开Chrome浏览器--〉F12--〉右下角的齿轮按钮(Settings)--〉选择"Overrides" 然后在"Overrides&q ...

  3. 社群系统 ThinkSNS+ 中如何利用 Laravel 表单验证来验证用户名的?(我朝独有需求,两个字母占一个汉字。。。)

    ThinkSNS+后端框架使用laravel,每周和 laravel master 保持同步,而后台和 html 5 则采用 vue 开发.语言特性方面,采用 php 7 的严格模式. 言归正传,之所 ...

  4. css3中的动画效果

    css3中的animation属性动画效果代码如下: <!DOCTYPE html> <html lang="en"> <head> <m ...

  5. java 序列化 serialVersionUID 的作用 和 两种添加方式

    serialVersionUID适用于Java的序列化机制.简单来说,Java的序列化机制是通过判断类的serialVersionUID来验证版本一致性的.在进行反序列化时,JVM会把传来的字节流中的 ...

  6. JSON数据表示格式简介(JavaScript对象表示法)

    [1] JSON简介    > JSON全称 JavaScript Object Notation    > 类似于JS中对象的创建的方法    > JSON和XML一样,都是一种表 ...

  7. java多线程基础(synchronize关键字)

    [toc] 基础知识 ---- 线程:进程(process)就是一块包含了某些资源的内存区域.操作系统利用进程把它的工作划分为一些功能单元. 线程:进程中所包含的一个或多个执行单元称为线程(threa ...

  8. Markdown+Pandoc 最佳写作拍档 (mailp.in)

    Markdown+Pandoc 最佳写作拍档 我们为什么写作? 自从人们开始写作,写作便是记录.抒发.批判.反省的好工具.从石板上的刻印到笔墨纸砚,再到如今的信息时代.从静态的个人主页到托管博客,从个 ...

  9. ThinkPHP5 封装邮件发送服务(可带附件)

    1.Composer 安装 phpmailer composer require phpmailer/phpmailer 2.ThinkPHP 中封装邮件服务类 我把它封装在扩展目录 extend/M ...

  10. [js高手之路]jquery插件开发实战-选项卡详解

    在jquery中,插件开发常见的有: 一种是为$函数本身扩展一个方法,这种是静态扩展(也叫类扩展),这种插件一般是工具方法, 还有一种是扩展在原型对象$.fn上面的,开发出来的插件是用在dom元素上面 ...