201521123055 《Java程序设计》第6周学习总结
1. 本章学习总结
2. 书面作业
Q1.代码阅读:Child压缩包内源代码
1.clone方法
1.1 Object对象中的clone方法是被protected修饰,在自定义的类中覆盖clone方法时需要注意什么?
1.2 自己设计类时,一般对什么样的方法使用protected进行修饰?以作业Shape为例说明。
1.3 在test1包中编写简单的Employee类,在test2包中新建一个TestProtected类,并在main中尝试调用test1包中的Employee的clone方法克隆一个新对象,能否成功?为什么?
答:
(1)首先贴上clone方法的源码描述:
protected native Object clone() throws CloneNotSupportedException;
projected关键字说明这是个被保护的方法,那么显然,这个方法只能被同包内的类和子类所访问;并且Object类内的clone方法并没有主体。因为所有类都是缺省继承Object类的,所以clone方法肯定是可以进行重写的,为了让重写后的clone方法可以被其他类调用,最好用public修饰clone方法。
下面以一个覆盖的clone方法为例:
public Object clone(){
Object o=null;
try {
o=super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return o;
}
编译发现报错,抛出 CloneNotSupportedException 异常,出现这个情况的原因是由于没有实现Cloneable接口(异常肯定会抛出,因为没有实现该接口所以导致这个异常没有“接住”,这个不细说),即:
public interface Cloneable {
}
Cloneable是标记接口,实现该接口的原因是为了给JVM提示,此类可以实现浅层复制的功能。
那么问题又来了,什么是浅层复制。关于这个问题,可以借助c++的指针来说明,如果两个指针指向同一地址,那么他们所指向的内容肯定相同,改动一个,另一个必然跟着变化,JAVA里由于没有指针的概念,很多人忘了引用与对象的区别。所以说浅层复制就是指创建一块区域存储复制体对象,实际上复制体与本体引用的是同一块内存区域。
有浅层复制自然肯定有深层复制,这里简单说一下,就是引用区块不同,于是乎深层复制需要用户自己重写,无非就是新建区域并赋值,这个就不展开了。
(2)根据protected所规定的访问范围,有些方法只想让同包的类和子类访问时采用protected修饰。以Shape为例,getPerimeter与getArea分别为计算面积与周长的方法,很明显只有继承了Shape的子类才具有这两种方法,因此可用protected修饰。
(3)首先,这俩类不在一个包内,也不是继承关系,不用测试也知道过不了。那么解决方法如下:
- 在test2包里加上import test1.Employee;
- 让TestProtected继承Employee类
Q2.使用匿名类与Lambda表达式改写题集面向对象2-进阶-多态接口内部类的题目5-2
答:
新建两个比较器:
Comparator<PersonSortable2> NameComparator=(o1,o2)-> o1.getName().compareTo(o2.getName());
Comparator<PersonSortable2> AgeComparator=(o1,o2)-> o1.getAge()-o2.getAge();
调用比较器:
Collections.sort(person,NameComparator);
Collections.sort(person,AgeComparator);
测试数据:
5
zhang 15
zhang 12
wang 14
Wang 17
li 17
运行结果:
NameComparator:sort
Wang-17
li-17
wang-14
zhang-15
zhang-12
AgeComparator:sort
zhang-12
wang-14
zhang-15
Wang-17
li-17
Q3.分析下列代码,回答shapeComparator所指向的对象与Comparator接口有什么关系?
Comparator<Shape> shapeComparator = new Comparator<Shape>() {
@Override
public int compare(Shape o1, Shape o2) {
//你的代码
}
};
答:其实就是用匿名内部类把compare进行重写,新建了一个比较器,那么这个shapeComparator类肯定是实现了Comparator接口的,并且可以通过Collection.sort进行调用。
Q4.GUI中的事件处理
4.1 写出事件处理模型中最重要的几个关键词。
4.2 使用代码与注释,证明你理解了事件处理模型。
答:
(1)事件处理三个部分:事件源—事件对象—事件监听器
(2)直接以购物图形化界面为例:
jb2=new JButton("加入购物车");
jb2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
Commodity c=new Commodity(Integer.valueOf(jtx2.getText()),jtx3.getText(), Double.valueOf(jtx4.getText()));
shopcar.add(c);
}
});
这是处理鼠标按下按钮的事件,使用了匿名内部类处理事件。
吐槽一下,JAVA做图形化实在难看,不适合做桌面软件,极不推荐使用。
Q5.结对编程:面向对象设计
首先提一下,这只是粗略的界面,具体有的功能其实不难写,主要是加了太多控件真的丑。。就简化一下吧
界面设计:
本来是想写管理员账号的,后来感觉实现功能不多,就先不写了,这两个界面功能也很简单,看按钮名就只知道。
3. 码云提交记录
上周已做完这周PTA,检阅上周提交记录即可。
4.实验总结
本次实验主要体会是在于匿名内部类的使用,在对于一次性的方法或者是结合Lambda进行重写方法有了较好的掌握。在对于自定义接口方面,其实应用还是挺多的,比如标记接口什么的,接口相对于继承来说灵活的多,因此面向接口编程其实是很好的一种思想,多多掌握这方面的知识有利于对JAVA的理解。
201521123055 《Java程序设计》第6周学习总结的更多相关文章
- 20145213《Java程序设计》第九周学习总结
20145213<Java程序设计>第九周学习总结 教材学习总结 "五一"假期过得太快,就像龙卷风.没有一点点防备,就与Java博客撞个满怀.在这个普天同庆的节日里,根 ...
- 20145213《Java程序设计》第二周学习总结
20145213<Java程序设计>第二周学习总结 教材学习内容总结 本周娄老师给的任务是学习教材的第三章--基础语法.其实我觉得还蛮轻松的,因为在翻开厚重的书本,一股熟悉的气息扑面而来, ...
- 20145213《Java程序设计》第一周学习总结
20145213<Java程序设计>第一周学习总结 教材学习内容总结 期待了一个寒假,终于见识到了神秘的娄老师和他的Java课.虽说算不上金风玉露一相逢,没有胜却人间无数也是情理之中,但娄 ...
- 21045308刘昊阳 《Java程序设计》第九周学习总结
21045308刘昊阳 <Java程序设计>第九周学习总结 教材学习内容总结 第16章 整合数据库 16.1 JDBC入门 16.1.1 JDBC简介 数据库本身是个独立运行的应用程序 撰 ...
- 20145330孙文馨 《Java程序设计》第一周学习总结
20145330孙文馨 <Java程序设计>第一周学习总结 教材学习内容总结 刚开始拿到这么厚一本书说没有压力是不可能的,开始从头看觉得很陌生进入不了状态,就稍微会有一点焦虑的感觉.于是就 ...
- 20145337 《Java程序设计》第九周学习总结
20145337 <Java程序设计>第九周学习总结 教材学习内容总结 数据库本身是个独立运行的应用程序 撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的增删查找 JDBC可以 ...
- 20145337 《Java程序设计》第二周学习总结
20145337 <Java程序设计>第二周学习总结 教材学习内容总结 Java可分基本类型与类类型: 基本类型分整数(short.int.long).字节(byte).浮点数(float ...
- 20145218《Java程序设计》第一周学习总结
20145218 <Java程序设计>第一周学习总结 教材学习内容总结 今天下午看了Java学习的视频,感觉很是新奇,之前觉得Java学起来是艰难枯燥的,但通过第一章的学习觉得如果自己可以 ...
- 《Java程序设计》第九周学习总结
20145224 <Java程序设计>第九周学习总结 第十六章 整合数据库 JDBC入门 ·数据库本身是个独立运行的应用程序 ·撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的 ...
- 《Java程序设计》第二周学习总结
20145224陈颢文<Java程序设计>第二周学习总结 教材学习内容总结 一.类型.变量与运算符 1.类型 整数: 可细分为为short整数(占2字节),int整数(占4字节),long ...
随机推荐
- python基础===使用switch方法,减少使用if语句
def jia(x,y): return x+y def jian(x,y): return x-y def cheng(x,y): return x*y def chu(x,y): return x ...
- python学习===判断两个日期的间距天数
import datetime d1 = datetime.date(2015,10,7) d2 = datetime.date(2015,8,15) print((d1-d2).days)
- C++基本知识点总结(网摘)
原文出处:[Fei Guo] 1. 结构体和共同体的区别. 定义: 结构体struct:把不同类型的数据组合成一个整体,自定义类型. 共同体union:使几个不同类型的变量共同占用一段内存. 地址: ...
- React Native热更新(iOS)-Pushy
React Native的出现,使的开发iOS代码出现了更便捷的方式.由于RN是使用脚本语言编写的,实现了"解释执行"的方式,而这种执行方式的修改只需替换脚步即可,不需要重新发布程 ...
- Nodejs 复制文件/文件夹
1.使用fs复制文件 使用fs对象的readFileSync,writeFileSync方法进行读写操作复制 cp.js function copyIt(from, to) { fs.writeFil ...
- python_cookie
cookielib是一个自动处理cookies的模块 ## 核心类 CookieJar:是cookie的集合,可以包含很多Cookie类,是我们的主要操作对象 FileCookieJar:继承自Coo ...
- fedora23安装配置记录
一.安装fedora 1.下载fedora的镜像文件,个人比较喜欢gnome,因而直接下载工作站版本了! http://start.fedoraproject.org/这个是浏览器首页,提供了fedo ...
- 一个C#操作RabbitMQ的完整例子
一.下载RabbitMQ http://www.rabbitmq.com/install-windows.html 二.下载OTP http://www.erlang.org/downloads 三. ...
- C#使用Xamarin开发可移植移动应用进阶篇(7.使用布局渲染器,修改默认布局),附源码
前言 系列目录 C#使用Xamarin开发可移植移动应用目录 源码地址:https://github.com/l2999019/DemoApp 可以Star一下,随意 - - 说点什么.. 本篇..基 ...
- WeQuant交易策略—Dual Thrust
Dual Thrust策略 策略介绍 Dual Thrust是一个趋势跟踪系统,由Michael Chalek在20世纪80年代开发,曾被Future Thruth杂志评为最赚钱的策略之一. Dual ...