201621123006 《Java程序设计》第6周学习总结
1. 本周学习总结
1.1 面向对象学习暂告一段落,请使用思维导图,以封装、继承、多态为核心概念画一张思维导图或相关笔记,对面向对象思想进行一个总结。
注1:关键词与内容不求多,但概念之间的联系要清晰,内容覆盖面向对象的核心内容即可。
注2:颜色要少、连线不要复杂,必要的时候要在连线上进行说明。
1.2 可选:使用常规方法总结其他上课内容。
- 内部类:成员内部类(可以访问外部类的所有成员);
静态内部类(用static关键字修饰);
方法内部类(在成员方法中定义的类)。
- 构造方法:在一个类中定义的方法如果同时满足以下三个条件,该方法称为 构造方法:
1、方法名与类名相同。
2、在方法名的前面没有返回值类型的声明。
3、在方法中不能使用return语句返回一个值。(以上引用自参考书)
- this 关键字:用于在方法中访问对象的其他成员。
- 抽象类:当一个类中不同的的方法被不同的子类调用时,需要将该类声明为抽象类。
- 接口:如果一个抽象类中的所有方法都是抽象的,则可以将这个类用接口来定义,定义接口时用关键字interface来声明
书面作业
clone方法
1.1 在test1包中编写Employee类,在test2包中新建一个Test类,并在其main中新建test1包中的Employee的对象,然后使用clone方法克隆一个新对象,能否成功?为什么?
- 不能。clone不可见。
clone()
方法被protected
修饰,不能在两个包中使用,只能被它的子类或是同一个包中的类调用。
1.2 如果要为自定义的类覆盖clone方法,需注意什么?
- 这个自定义类要实现
Cloneable
接口并用public
修饰。 - 被
protected
修饰的方法只能被同一个包中的类或是自己的子类调用,所以在自定义类覆盖clone
方法时,需要保证该类继承自Object
类。
1.3 Object对象中的toString, equals, hashCode方法都使用public修饰,而clone方法却被protected修饰,请尝试解释原因。为什么不声明为public呢?
- Object中的
clone()
方法默认浅拷贝,用public
修饰的话可以对这个方法直接调用,当对复制的信息进行修改时,原本的信息也可能被修改,这是非常危险的。用protected
修饰clone()
方法,使其只能被本包中的子类访问,增强了安全性。
内部类
2.1 使用匿名类与Lambda表达式改写题集面向对象2-进阶-多态接口内部类的题目7-2。请贴图关键代码与运行结果,请在运行结果中出现你的学号与姓名。
2.2. 分析下列代码,回答shapeComparator所指向的对象与Comparator接口有什么关系?
Comparator shapeComparator = new Comparator() { @Override public int compare(Shape o1, Shape o2) { //你的代码 } };
- shapeComparator使用匿名内部类实现了Comparator接口,重写了compare方法。
2.3 题集:6-1(匿名内部类)实验总结。你觉得使用匿名内部类有什么好处?
- 匿名内部类是实现接口的一种简便写法,实现后我们不需要再创建一个新的类,简化了代码。
PTA实验总结
3.1 PTA(自定义接口)。并回答:相比较不写接口,直接写一个类包含IntegerStack相应的方法来说,定义IntegerStack接口,然后定义其实现类这种方式有什么好处?
- 这样我们可以对
IntegerStack
接口直接进行操作,后续我们就多了一些选择,不仅可以通过数组来实现还可以用列表来实现相应的功能,程序就灵活了很多。
3.2 PTA(静态内部类)。并回答:你觉得什么时候应该使用静态内部类?静态内部类与内部类有什么区别?
- 内部类与其所在的外部类是有一定关系的,当内部类中有静态属性和方法,而且不需要调用外部类中的非静态属性和方法时,我们就可以用static来修饰这个内部类。
- 区别:1)静态内部类可以有静态属性和方法
2)静态内部类只能访问外部类中的静态属性和方法,非静态内部类可以访问外部类中的所用属性和方法。
3)静态内部类可以直接生成对象Outer.Inner in = new Outer.Inner()
,而内部类在生成对象时需要依赖外部类的对象实例,必须先生成一个外部类对象实例,再通过外部类的对象实例生成内部类对象。
3.3 PTA(继承覆盖综合练习-Person、Student、Employee、Company)。并回答:使用Collections.sort对引用类型数组进行排序需要有一个什么前提条件?
- 需要实现Comparable或者Comparator接口并重写其中的方法。
4.大作业-继续完善(尝试使用接口改造你们的系统)
参考Case-StudentDao.zip案例
假设在不同的实现中,购物车里的商品有的是存放在ArrayList,有的是存放在数组中。
4.1 现在希望将系统中购物车的操作抽象到相应的DAO接口。
interface ShoppingDao{
public boolean addSnack(Snack snack);
public boolean delSnack(Snack snack);
public double totalPrice();
public void displayAllGoods();
}
4.2 为该接口定义至少两个实现(如数组、列表、文件)。截图自己负责部分的关键代码,要求出现名字与学号。
列表实现:
4.3 给出你们的Main程序,说明定义DAO接口的好处。
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in
);
Snack []snacks1 = new Snack[15];
Snack []snacks = new Snack[80];
Snack []snacksCount = new Snack[80];
int n = 0 ;
ShoppingDao shoppingDao = new ShoppingCartDaoList();
System.out.println("\t**********货品清单**********");
System.out.println("\t编号\t\t商品名称\t\t商品单价");
for (Snack e: snacks1) {
System.out.println("\t"+e.getNumber()+"\t\t"+ e.getName()+"\t\t" + e.getPrice());
}
System.out.print("\t\tWelcome~~~~\n\t请选择要购买的商品编号:");
while(sc.hasNext())
{
int number = sc.nextInt();
if (number == 0)
break;
snacks[n] =snacks1[number-1];
System.out.print("\t请输入要购买的数量:");
int num = sc.nextInt();
snacks[n].setCount(num);
shoppingDao.addSnack(snacks[n]);
System.out.print("\t加入购物车成功!\t如果继续添加请输入商品编号,否则输入0结束!\n\t请输入:");
n++;
}
System.out.println("*****User:201621123001张艺琳*****");
System.out.println("\t\t++++++购物车列表++++++");
shoppingDao.displayAllGoods();
shoppingDao.totalAllPrice();
shoppingDao.delSnack(snacks[1]);
}
}
- 好处:有了这个接口,我们可以用不同的形式来存储信息。
代码阅读:PersonTest.java(abstract、多态、super)
5.1 画出类的继承关系
5.2 main函数的代码实现什么功能?
- 将Person中的四个对象按年龄升序输出。
5.3 如果将子类中的super构造函数去掉行不行?
- 不行。子类需要super关键字来继承父类的构造函数。去掉super后子类将无法调用父类中重写的方法。
5.4 PersonTest.java中哪里体现了多态?
参考链接:
PersonTest.java
- 在
PersonTest.java
中,各类都重写了toString方法,方法名相同但执行效果各异,这就是多态的一种体现。
3.码云及PTA
题集:jmu-Java-04-面向对象2-进阶-多态接口内部类
3.1. 码云代码提交记录
在码云的项目中,依次选择“统计-Commits历史-设置时间段”, 然后搜索并截图
3.2 截图PTA题集完成情况图
需要有两张图(1. 排名图。2.PTA提交列表图)
3.3 统计本周完成的代码量
需要将每周的代码统计情况融合到一张表中。
最新文章
- ftp常用命令
- (转)spring boot注解 --@EnableAsync 异步调用
- Android自定义View之倒计时Countdown实现
- mysql数据库移植
- Hibernate关联映射关系
- ActiveMQ学习(四)——应用程序接口
- c数组与指针
- Android 使用MediaRecorder录音
- 在linux的shell里访问一个URL
- lightoj 1198 最大权重匹配
- php 利用socket上传文件
- Fillder安装,如何解决证书无法导出
- Unity 关于AssetBundle读取场景
- nc linux命令详解
- FCC JS基础算法题(1):Factorialize a Number(计算一个整数的阶乘)
- SSH原理和应用
- github个人作业
- 2018.10.31 bzoj3339&&3585mex(主席树)
- Android-Binder机制
- Receiver not registered.