1. 本周学习总结
1.1 尝试使用思维导图总结有关多态与接口的知识点。
2. 书面作业
Q1. 代码阅读:Child压缩包内源代码
1.1 com.parent包中Child.java文件能否编译通过?哪句会出现错误?试改正该错误。并分析输出结果。
答:不能通过编译,从上图可以看到public void getParenti()这条语句出现了问题语句显示The field Parent.i is not visible.原因是因为父类中的i是用修饰符private,只能在自己的类中使用,不能在其他类中调用;可以将private改成protected;
运行结果:
c.getParenti();输出父类中的i也就是1,c.getParentj();输出super.j,j,geti(),super.geti(),也就是2 2 1 1,Other.showParentj(p);输出父类中的j和i 就是2 1;所以运行结果就是1 2 2 1 1 2 1.
1.2 外一个包中的OutOfParentPackage.java,能否编译通过?提示什么错误?分析原因。
答:不能通过编译,显示错误The type Parent is not visible,因为Parent前未加任务修饰符,修饰符为默认而OutOfParentPackage在外包使用,所以就不能使用Parent的方法。要修改的话在Parent类的前面加上public即可。 System.out.println(p.j);改成p.get(j).
1.3 回答:如果为了访问到protected
修饰的属性或方法应该怎么办?
答:protected的访问范围是本类,同一个包或是子类,所以要访问protected修饰的属性或方法可以在同一个类中调用protected修饰的属性或方法
Q2. 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 class Guess {
public static void main(String[] args) {
GuessGame game = new ConsoleGame();//这边使用了抽象类GuessGame
game.go();
}
}
//GuessGame.java
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 如果想将该游戏改造成图形界面,应该进行一些什么操作?
答:可以使用java.awt和swing包来设计图形界面。
AWT(Abstract Window Toolkit),中文译为抽象窗口工具包,是Java提供的用来建立和设置Java的图形用户界面的基本工具。AWT由Java中的java.awt包提供,里面包含了许多可用来建立与平台无关的图形用户界面(GUI)的类,这些类又被称为组件。Swing是一个用于开发Java应用程序用户界面的开发工具包。以抽象窗口工具包(AWT)为基础使跨平台应用程序可以使用任何可插拔的外观风格。Swing开发人员只用很少的代码就可以利用Swing丰富、灵活的功能和模块化组件来创建优雅的用户界面。
2.3 结合该例子,你觉得什么时候应该使用abstract
?
答:abstract用于抽象类,抽象方法指的是只有声明而没有方法。例如求图形面积的时候,有各种各样的图形,但它们都有一个求面积的方法,这时候就可以用到抽象类。或者未来要需要这种方法是,可以先使用抽象方法。
2.4 重要:在这个例子中,变化的是什么,不变的是什么?尝试结合abstract、继承等概念进行说明。
答:在这个例子中变化的是运行环境,不变的是猜数字这个游戏。使用了abstract进行编程就可以在不同平台运行,它会根据用户实际的情况而改变。但是继承就是子类复用了父类的方法。
Q3. Comparable与Comparator
3.1 描述Comparable接口的用途。为什么某个类实现了Comparable接口就可以直接使用Arrays.sort对其进行排序?
// Insertion sort on smallest arrays
if (length < INSERTIONSORT_THRESHOLD) {
for (int i=low; i<high; i++)
for (int j=i; j>low &&
((Comparable) dest[j-1]).compareTo(dest[j])>0; j--)
swap(dest, j, j-1);
return;
}
// Merge sorted halves (now in src) into dest
for(int i = destLow, p = low, q = mid; i < destHigh; i++) {
if (q >= high || p < mid && ((Comparable)src[p]).compareTo(src[q])<=0)
dest[i] = src[p++];
else
dest[i] = src[q++];
}
答:Arrays有一方法 public static void sort(Object[] a)功能:对指定对象数组按升序进行排序, 数组中的所有元素都必须实现 Comparable 接口。因为sort源代码中运用到了(Comparable)这是一个类型指派,也就是说要转化成Comparable才能正确使用该方法。然而如果一个类并没有去操作Comparable接口,它就不能被正确的指派。
3.2 有了Comparable接口为什么还需要Comparator接口呢?
答:compareTo()方法是放在对象类里面的,在集合内部实现compareTo()的方法。Comparator是在集合外部实现的排序,compare()是放在比较对象的类外面的。当对象不支持自比较函数或者自比较函数不满足要求时(即不能通过Comparable实现对象的排序),可以写一个比较器来完成两个对象之间大小的比较。
Q4. 面向接口案例分析
4.1 画出类关系图,描述每个类与接口的作用。
- Student类:提供属性name。
- StudentDao接口:提供三个抽象方法,写入学生数据、读取学生数据和显示所有学生信息。对于写入学生数据,通过一个boolean变量来判断是否写入成功。
- StudentDaoArrayImpl类:用数组来存放学生信息,具体实现接口的三个抽象方法,读取学生信息,如果找不到返回null;如果遍历整个数组,没找到学生信息返回false。显示所有学生信息则要求对象都是非空的。然后还有一个构造器,提前根据用户的输入开对应长度的数组。
StudenDaoListImpl类:用列表来存放学生信息,具体实现接口的三个抽象方法。
4.2 StudenDaoListImpl与StudentDaoArrayImpl有何区别?
答:两种方法实现的结果相同但是StudentDaoArrayImpl是用数组来存储学生,此存储方式有个弊端就是学生的数量一开始就要决定,有可能造成数量的过少浪费内存或数量过多而无法存储学生;StudenDaoListImpl使用ArrayList来存储学生,可以随意增加空间。
Q5. 什么是面向接口编程?面向接口编程的好处是什么?
结合题目3与4中的Test.java的代码讨论分析。不要百度原封不动照搬!
题目3用到了两个接口,分别是Comparable和Comparator。通过这两个接口,我们可以很方便的对数据进行比较,并且比较规则可以根据自己想要的方式进行。题目4,类似于一个存放学生数据的数据库。在这个Test类里面,我们只要做的就是确定数据到底是以何种数据结构来存放。这些都是一开始从设计之初就相好的。
接口就是系统设计规范应是定义与实现分离。
接口的好处就是可以不用提供实现细节,而只是提供该接口应该具备怎样的行为,或者说具有什么方法.
Q6. 结对编程:面向对象设计(大作业2-非常重要)
内容:使用Java代码完成上周做的面向对象设计大作业,需要有初步界面。实现的功能尽量简单,少而精,只包含必要的功能,不要追求高大全。
写出:类图(尽量精简,不用太多子类,两个即可)、系统常用功能描述、关键代码与界面
形式: 两人依托码云合作完成。请在这里贴出你们的学号、姓名与任务分工。
注意: 再过几次课要讲Java图形界面编程,到时候要将该系统升级为图形界面。系统的业务逻辑部分应该变化不大,变化大的是输入与输出部分。所以编码的时候,输入(Scanner)与输出(System.out)的代码,请不要将其与某个业务处理函数绑死。
6.1
黄绍桦 | 学生B | 项目地址 |
---|---|---|
https://www.cnblogs.com/huangsh/ | 无 | https://git.oschina.net/huangsh1/test.git |
6.2
6.3
import java.util.*;
public class Product {
private String productName;// 商品名称
private double price;// 单价
public Product() {// 无参构造
super();
}
public Product(String productName, double price) {
super();
this.productName = productName;
this.price = price;
}
@Override
public String toString() {
return "Product [productName=" + productName + ", price=" + price + "]";
}
public String getProductName() {
return productName;
}
public void setProductName(String productName) {
this.productName = productName;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public class ProductItem extends Product {
private int count;// 商品数量
public double totalMoney() {// 小计
double price = super.getPrice();// 获取商品单价
return price * count;
}
public ProductItem() {
super();
}
public ProductItem(int count) {
this.count = count;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
}
public interface Shop {// 接口
public void shopcar1(List<ProductItem> com);// 购物车一览
}
public class Cart implements Shop {
@Override
public void shopcar1(List<ProductItem> com) {// 购物车一览
// TODO Auto-generated method stub
for (ProductItem p : com) {
// TODO Auto-generated method stub
System.out.println("商品名" + p.getProductName() + "数量" + p.getCount() + "总价" + p.totalMoney());
}
}
6.4 运行界面
(电脑里编译出错)
3. 码云上代码提交记录及PTA实验总结
3.1 码云代码提交记录
3.2 PTA实验总结
- 5-1 Arrays.sort不能对自定义对象进行排序。实现Comparable接口建立类实现Comparable接口 语法:[修饰符] class 类名 implements{};
- 5-2 Comparator是在集合外部实现的排序,compare()是放在比较对象的类外面的。需要另写类来实现。
- 接口匿名内部类,直接调用接口方法,语法 Interface i=new Interface{抽象方法};