1. 本周学习总结
2. 书面作业
1.代码阅读:Child压缩包内源代码
1.1 com.parent包中Child.java文件能否编译通过?哪句会出现错误?试改正该错误。并分析输出结果。
- 不能。因为Parent类中的i是private,只有在本类中才能访问,子类中不能访问。可以改为 public或者protected。
- 输出结果如下图
class Parent{
public int i=1;
protected int j=2;
protected int geti(){
return i;//geti()返回的是i的值
}
public void getj(){
System.out.println(j);
}
}
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,所以都可以被访问。i=1
}
public void getParentj(){
System.out.println(super.j);//这里的super.j是指访问父类的j,但是如果j是private就无法访问 j=2
System.out.println(j);//j=2
System.out.println(geti());//geti()=1,因为返回值是i
System.out.println(super.geti());super.geti()=1
}
}
class Other{
public static void showParentj(Parent p){
System.out.println(p.j);//p.j=2;
System.out.println(p.geti());//p.geti()=1
}
}
1.2 另外一个包中的OutOfParentPackage.java,能否编译通过?提示什么错误?分析原因。如何更改才能使之正常编译?
- 不能
- 错误信息
The public type OutOfParentPackage must be defined in its own file
公共型outofparentpackage必须定义在它自己的文件
- 这时,把
public class OutOfParentPackage
中的public删除,编译正常通过。 由于我是把几个java代码放在了一个里面,所以只能有一个public类
java程序是从一个public类的main函数开始执行的,(其实是main线程),就像C程序是从main()函数开始执行一样。
只能有一个public类是为了给类装载器提供方便。 一个public 类只能定义在以它的类名为文件名的文件中。
每个编译单元(文件)都只有一个public 类。因为每个编译单元都只能有一个公共接口,用public类来表现。该接口可以按照要求包含众多的支持包访问权限的类。如果有一个以上的public 类,编译器就会报错。
并且public类的名称必须与文件名相同(严格区分大小写)。 当然一个编译单元内也可以没有public类。
在一个源文件.JAVA文件中可以有很多类,只有一个PUBLIC类其他的都不能是。
输出结果:
2.abstract进阶:阅读GuessGame抽象类的设计与使用源代码
2.1 Guess改造前代码很简单,而改造后的代码使用了抽象类、抽象方法看起来很复杂,那这样的改造到底有什么好处呢?
抽象类表示该类中可能已经有一些方法的具体定义,但是接口就仅仅只能定义各个方法的界面(方法名,参数列表,返回类型),并不关心具体细节。
在面向对象方法中,抽象类主要用来进行类型隐藏。构造出一个固定的一组行为的抽象描述,但是这组行为却能够有任意个可能的具体实现方式。这个抽象描述就是抽象类,而这一组任意个可能的具体实现则表现为所有可能的派生类。模块可以操作一个抽象体。由于模块依赖于一个固定的抽象体,因此它可以是不允许修改的;
- 简单来说,可以通过继承抽象类来实现多态,后期绑定,可以为将来要实现的东西做好接口。比如输入输出不会仅仅绑定控制台。
- 同时,抽象类不能被实例化,可以通过方法的覆盖来实现多态的属性,也就是运行期绑定。
2.2 如果想将该游戏改造成图形界面,应该进行一些什么操作?
首先要导入swing包
import javax.swing.*;
Swing 是一个为Java设计的GUI工具包。
Swing是JAVA基础类的一部分。
Swing包括了图形用户界面(GUI)器件如:文本框,按钮,分隔窗格和表。
Swing它们支持可更换的面板和主题(各种操作系统默认的特有主题),然而不是真的使用原生平台提供的设备,而是仅仅在表面上模仿它们。这意味着你可以在任意平台上使用JAVA支持的任意面板。轻量级组件的缺点则是执行速度较慢,优点就是可以在所有平台上采用统一的行为。
- 之后是要设计窗口。在 main 方法中,创建一个对象,调用从 JFrame 父类中继承的相关方法即可将窗口显示出来
向窗口中添加第一个控件
2.3 结合该例子,你觉得什么时候应该使用abstract?
- abstract(抽象)修饰符,可以修饰类和方法。
如果是只想将一类对象的共同点抽象出来,成为代表该类共同特征的一个抽象概念,就可以用abstract修饰这个类的这个特征当作父类。###2.4 重要:在这个例子中,变化的是什么,不变的是什么?尝试结合abstract、继承等概念进行说明。
2.4 重要:在这个例子中,变化的是什么,不变的是什么?尝试结合abstract、继承等概念进行说明。
- 不变的是猜数字这个游戏本身的游戏规则,游戏机制。不管我们的环境形式怎么变,这个游戏本质的规定都是一样的。计算机获取随机数,玩家去猜测数字。
- 变了的是输入输出形式。不再与控制台绑定,反而是可以以任何一种形式进行。但是与此同时,没有定下具体的输入输出环境,也是没法开始游戏的,之前的绑定控制台就是其中一种形式。
3.Comparable与Comparator
3.1 描述Comparable接口的用途。为什么某个类实现了Comparable接口就可以直接使用Arrays.sort对其进行排序?
- Comparable接口是排序接口,此接口强行对实现它的每个类的对象进行整体排序,并重写Comparable接口中的compareTo。
- 实现此接口的对象列表(和数组)可以通过 Collections.sort (和 Arrays.sort )进行自动排序
- Arrays.sort(); //sort方法可以实现对对象数组排序,但是必须实现 Comparable接口。
- 每个Comparable接口可以实现一种排序方法,多个Comparable接口可以实现多种排序方法。把排序类的对象传到Arrays.sort()就可以进行不同类型的排序
3.2 有了Comparable接口为什么还需要Comparator接口呢?
- Comparable是排序接口;若一个类实现了Comparable接口,就意味着“该类支持排序”,相当于一个内部比较器
- Comparator是比较器;我们若需要控制某个类的次序,可以建立一个“该类的比较器”来进行排序,相当于一个外部比较器。‘
- 简单来说就是一个是自已完成比较,一个是外部程序实现比较的差别而已
4.面向接口案例分析
4.1 画出类关系图,描述每个类与接口的作用。
4.2 StudenDaoListImpl与StudentDaoArrayImpl有何区别?
- StudenDaoListImpl使用的是列表(List)。List是一个接口,不能实例化
StudentDaoArrayImpl是使用数组
ArrayList实现了可变大小的数组。它允许所有元素,包括null。ArrayList没有同步。size,isEmpty,get,set方法运行时间为常数。但是add方法开销为分摊的常数,添加n个元素需要O(n)的时间。其他的方法运行时间为线性。
每个ArrayList实例都有一个容量(Capacity),即用于存储元素的数组的大小。这个容量可随着不断添加新元素而自动增加,但是增长算法并没有定义。当需要插入大量元素时,在插入前可以调用ensureCapacity方法来增加ArrayList的容量以提高插入效率。
StudentDaoArrayImpl里面写了每种方法的使用。
5.什么是面向接口编程?面向接口编程的好处是什么?
在一个面向对象的系统中,系统的各种功能是由许许多多的不同对象协作完成的。在这种情况下,各个对象内部是如何实现自己的,对系统设计人员来讲就不那么重要了;而各个对象之间的协作关系则成为系统设计的关键。小到不同类之间的通信,大到各模块之间的交互,在系统设计之初都是要着重考虑的,这也是系统设计的主要工作内容。面向接口编程就是指按照这种思想来编程。————《百度百科》
- 设计接口的一个重要原则就是接口所处的环境,任何接口都是在一定的环境中产生的。
- 面向接口编程先把客户的业务提取出来,作为接口。业务具体实现通过该接口的实现类来完成。当客户需求变化是,只需要编写该业务逻辑的新的实现类。
- 面向接口编程在需要变动总体需求的时候,不需要改写现有代码,减少对系统的影响。代码易懂,方便扩展,可维护性强。
但是因为我们一般的程序都比较小,接口设计也不是太合理,往往需求变了接口也要变。所以面向接口编程,对大家都好......
结合题目3与4中的Test.java的代码讨论分析
StudentDao sdm = new StudenDaoListImpl()
- sdm定义为StydentDao接口,通过sdm.XXX直接调用方法。
比如说我们对输入学生姓名的判断要进行改动,不需要动主程序,Test的代码内容基本可以保持不动。只要在接口里面修改代码即可。
结对编程:面向对象设计(大作业2-非常重要)
内容:使用Java代码完成上周做的面向对象设计大作业,需要有初步界面。实现的功能尽量简单,少而精,只包含必要的功能,不要追求高大全。
写出:类图(尽量精简,不用太多子类,两个即可)、系统常用功能描述、关键代码与界面
形式: 两人依托码云合作完成。请在这里贴出你们的学号、姓名与任务分工。
注意: 再过几次课要讲Java图形界面编程,到时候要将该系统升级为图形界面。系统的业务逻辑部分应该变化不大,变化大的是输入与输出部分。所以编码的时候,输入(Scanner)与输出(System.out)的代码,请不要将其与某个业务处理函数绑死。
选做加分: 给出两人在码云上同一项目的提交记录截图,额外加分。注:两个人在码云上新建一个项目。
姓名 | 地址 |
---|---|
游舒婷 | http://www.cnblogs.com/sakurai3104/p/6617348.html |
杨晨露 | http://www.cnblogs.com/ycll/p/6610019.html |
码云 | http://git.oschina.net/sakurai3104/Shopping |
商品类,所有的商品都继承自这个类
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;
}
}
书类,因为这里只定义了价格,书名和库存,就直接继承父类,没有再添加其他的属性。但是如果是比如衣服类的话,还要增加衣服的尺码等属性。
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();
}
}
购物车类
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;
}
}
3. 码云上代码提交记录
4.实验总结
(1)public :任何地方都能访问
(2)private:只有在本类中才能访问
(3)protected:只有在本包中才能访问,而在包外只有他的子类能访问
(4)默认:包访问权限 ,只有在本包才能访问,包括本包内的子类和普通类。但是在包外,都不能访问。
(5)
/**
* 如果o1小于o2,返回一个负数;如果o1大于o2,返回一个正数;如果他们相等,则返回0;
*/
@Override
public int compare(Step o1, Step o2) {
Date acceptTime1=UtilTool.strToDate(o1.getAcceptTime(), null);
Date acceptTime2=UtilTool.strToDate(o2.getAcceptTime(), null);