201521123006 《Java程序设计》第6周学习总结
1. 本周学习总结
**1.1 面向对象学习暂告一段落,请使用思维导图,以封装、继承、多态为核心概念画一张思维导图,对面向对象思想进行一个总结。 **
- 注1:关键词与内容不求多,但概念之间的联系要清晰,内容覆盖面向对象的核心内容即可。
- 注2:颜色要少、连线不要复杂,必要的时候要在连线上进行说明。

**1.2 可选:使用常规方法总结其他上课内容。 **
- 接口:(1)接口(interface)就是方法声明和常量值的集合。
(2)实现接口的类叫接口的实现类。
(3)Comparable接口抽象出了比较的共同特性。
(4)接口不是类,不能使用new进行实例化,使用instanceof运算符,可以扩展,可以包含常量。
(5)一个类可以实现多个接口。
(6)对象克隆使用Cloneable接口:(1)覆盖clone方法,声明为public。(2)实现Cloneable接口。
(7)回调使用ActionListener接口。
(8)嵌套类分为两种:static,non static(被称为内部类)。
(9)匿名类:匿名类没有类名,使用Lambda表达式可以大幅简化代码。 - GUI与Swing:(1)顶层窗口被称为框架(Frame),Swing中叫JFrame。
(2)初始化语句结束后,main方法退出但没有终止程序,终止的只是主线程。
(3)Component类中的setLocation(x,y)(设置位置), setBounds(x,y,width,height) (设置位置与大小)。
(4)布置组件在界面中的位置:(1)使用NetBeans IDE,不用手写相关布局代码。直接在页面上进行拖放调整即可(WYSIWYG)。(2)也可以自己手动编写布局代码,这时候就需要了解布局管理器。
2. 书面作业
**1.clone方法 **
**1.1 Object对象中的clone方法是被protected修饰,在自定义的类中覆盖clone方法时需要注意什么? **
(1)clone方法的源代码为:protected native Object clone() throws CloneNotSupportedException;
因为clone方法被protected修饰,所以clone方法将不能在类的外部使用。
(2)因此在自定义的类中覆盖clone方法需要将访问修饰符从protected改设为public。
**1.2 自己设计类时,一般对什么样的方法使用protected进行修饰?以作业Shape为例说明。 **
(1)因为使用protected修饰,是当我们希望可以直接访问父类成员的时候或者是希望被子类覆盖的时候。使用protected进行修饰的方法子类可以访问,同包的其他类也可以访问父类的protected属性和方法。
(2)所以对于作业Shape来说
abstract class Shape {
public static double PI=3.14;
protected abstract double getPerimeter();
protected abstract double getArea();
}
class Rectangle extends Shape{
...//此段代码省略
}
class Circle extends Shape{
...//此段代码省略
}
此时Shape是父类,有getPerimeter()和getArea();两种方法,而Rectangle类和Circle类都继承了Shape类,是Shape的子类,所以他们都有getPerimeter()和getArea();两种方法,这是我们就可以使用protected进行修饰。
**1.3 在test1包中编写简单的Employee类,在test2包中新建一个TestProtected类,并在main中尝试调用test1包中的Employee的clone方法克隆一个新对象,能否成功?为什么? **
package test1;
public class Employee implements Cloneable {
private String name;
private double salary;
public Employee(String n, double s){
super();
this.name = n;
this.salary = s;
}
protected Employee clone() throws CloneNotSupportedException
{
// call Object.clone()
Employee cloned = (Employee) super.clone();
return cloned;
}
}
package test2;
import test1.Employee;
class TestProtected{
private String name1;
private double salary1;
}
public class Test
{
public static void main(String[] args)
{
Employee original = new Employee("John Q. Public", 50000);
Employee copy = null;
try{
copy = original.clone();
}
catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("original=" + original);
System.out.println("copy=" + copy);
}
}
不能成功,因为Employee类和TestProtected类没有在一个包中,而clone方法为protected修饰,所以不能成功。如果想要成功需要将protected改为public。
**2.使用匿名类与Lambda表达式改写题集面向对象2-进阶-多态接口内部类的题目5-2 **
- 仅需粘贴关键代码与运行结果,图片不要太大。
- 匿名类
Comparator<PersonSortable2> NameComparator = new Comparator<PersonSortable2>(){
@Override
public int compare(PersonSortable2 o1, PersonSortable2 o2) {
if(!o1.getName().equals(o2.getName())){
if(o1.getName().compareTo(o2.getName())>0)
return 1;
else
return -1;
}
return 0;
}
};
Comparator<PersonSortable2> AgeComparator = new Comparator<PersonSortable2>(){
@Override
public int compare(PersonSortable2 o1, PersonSortable2 o2) {
if(!(o1.getAge()==o2.getAge())){
if(o1.getAge()>o2.getAge())
return 1;
else
return -1;
}
return 0;
}
};

- Lambda表达式
Comparator<PersonSortable2> AgeComparator = (o1,o2)->{
if(!(o1.getAge()==o2.getAge())){
if(o1.getAge()>o2.getAge())
return 1;
else
return -1;
}
return 0;
};
Comparator<PersonSortable2> NameComparator = (o1,o2)->{
if(!o1.getName().equals(o2.getName())){
if(o1.getName().compareTo(o2.getName())>0)
return 1;
else
return -1;
}
return 0;
};

**3.分析下列代码,回答shapeComparator所指向的对象与Comparator接口有什么关系? **
Comparator<Shape> shapeComparator = new Comparator<Shape>() {
@Override
public int compare(Shape o1, Shape o2) {
//你的代码
}
};
shapeComparator所指向的对象实现了Comparator接口,在匿名类中重写接口当中的抽象方法,使得可以使用接口的抽象方法,例如本题的compare方法。
**4.GUI中的事件处理 **
**4.1 写出事件处理模型中最重要的几个关键词。 **
- 事件:在GUI上的操作时会触发的相对应的事件,例如敲击键盘或点击鼠标这样的事件。
- 事件源:产出事件的组件,例如按钮。
- 事件处理方法:能够接受,分析,处理事件类对象,实现与用户交流的方法。
- 事件监听器:对组件所产生的事件作出具体响应的代码,也可以说是调用事件处理方法的对象,例如ActionListener监听器。
- 事件适配器:根据所使用的的事件监听器调用对应的事件适配器,使用事件适配器的方法,这样仅需重写需要的代码就行。
**4.2 使用代码与注释,证明你理解了事件处理模型。 **
使用匿名类实现监听接口
public class EventMainGUI1 extends Frame{
static int count=1;
public EventMainGUI1 (String title){super(title);}
public static void main(String args[]){
EventMainGUI1 f=new EventMainGUI1 ("hello");//初始化窗体,标题为"hello"
f.setLayout(new FlowLayout());//采用流式布局
final JButton b = new JButton("1");//事件源,创建一个按钮,初始化文本为"1"
//监听器,添加一个活动监听
b.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent evt){
//每次count加1,就会触发
b.setLabel(new Integer(++count).toString());
}
};
f.add(b);//添加按钮
f.setSize(100,100);//设置窗体大小
f.setBackground(Color.blue);//设置窗体颜色
f.setVisible(true);//设置窗口显示出来:如果窗口是第一次显示,将事先初始化窗口显示的相关资源再显示
}
}
**结对编程:面向对象设计(大作业2-非常重要,未完成-2) **
继续完善上周的项目作业。考核点如下:
**5.1 尝试使用图形界面改写。 **


private void loginActionPerformed(java.awt.event.ActionEvent evt) {
String a=user.getText();
String b=password.getText();
if(a.equals("xwp")&&b.equals("123456")){
output.setText("登录成功,欢迎选购");
new NewJFrame1().setVisible(true);
}
else
output.setText("登录失败,请重新输入");
}
private void exitActionPerformed(java.awt.event.ActionEvent evt) {
System.exit(0);
}

private void watchActionPerformed(java.awt.event.ActionEvent evt) {
new NewJFrame2().setVisible(true);
}
private void exitActionPerformed(java.awt.event.ActionEvent evt) {
System.exit(0);
}
private void userActionPerformed(java.awt.event.ActionEvent evt) {
new NewJFrame4().setVisible(true);
}
private void searchActionPerformed(java.awt.event.ActionEvent evt) {
new NewJFrame3().setVisible(true);
}
private void shoppingcartActionPerformed(java.awt.event.ActionEvent evt) {
new NewJFrame5().setVisible(true);
}
进行各个窗体之间的跳转。
- 浏览商品

private void ShoppingcartActionPerformed(java.awt.event.ActionEvent evt) {
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
}
- 搜索商品


private void searchActionPerformed(java.awt.event.ActionEvent evt) {
String key=goodname.getText();
if(key.equals("Java"))
put.setText("商品:Java - 单价:65.30");
else if(key.equals("Math"))
put.setText("商品:Math - 单价:33.80");
else if(key.equals("数字逻辑"))
put.setText("商品:数字逻辑 - 单价:35.00");
else if(key.equals("skirt"))
put.setText("商品:skirt - 单价:87.50");
else if(key.equals("jeans"))
put.setText("商品:jeans - 单价:99.00");
else if(key.equals("jacket"))
put.setText("商品:jacket - 单价:150.00");
else
put.setText("对不起,没有找到该商品");
}
private void closeActionPerformed(java.awt.event.ActionEvent evt) {
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
}
- 显示信息

private void ShoppingcartActionPerformed(java.awt.event.ActionEvent evt) {
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
}
- 查看购物车

**5.2 给出两人在码云上同一项目的提交记录截图。 **

**5.3 与上周相比,项目的主要改动是什么? **
项目的主要改动是:使用NetBeans进行编程,进行输入输出。主要是将原代码中的输入输出有控制台改为图形界面输入输出。
参考资料:
结对编程参考资料
使用Processon画图
视频-使用Netbeans编写GUI
重要:Swing实验参考资料
JTable用法,用于呈现表格数据
Swing相关文章
**3. 码云上代码提交记录及PTA实验总结 **
**题目集:jmu-Java-04-面向对象2-进阶-多态接口内部类 **
**3.1. 码云代码提交记录 **
- 在码云的项目中,依次选择“统计-Commits历史-设置时间段”, 然后搜索并截图

**3.2. PTA实验 **
函数(选做:4-1)、编程(5-3, 5-4)
一定要有实验总结
实验4-1:本题中的输入需要使用final关键字进行修饰,并且使用了匿名内部类的方法,还需要在匿名类中重写ActionListener对象相应的方法。
实验5-3:本题中使用了栈来储存输入的值,这时候我们就需要考虑栈空和栈满的情况,可以使用栈顶指针的值来判断,并且输出栈内元素时栈顶指针先减一。
实验5-4:本题中在
ArrayUtils类内部创建一个静态内部类PairResult。在ArrayUtils类中使用PairResult类的方法时,只需使用类名.方法名调用就行。而在Main函数中则是使用ArrayUtils.方法名来调用。
201521123006 《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 ...
随机推荐
- Socket学习总结系列(二) -- CocoaAsyncSocket
这是系列的第二篇 这是这个系列文章的第二篇,要是没有看第一篇的还是建议看看第一篇,以为这个是接着第一篇梳理的 先大概的总结一下在上篇的文章中说的些内容: 1. 整理了一下做IM我们有那些途径,以及我们 ...
- 设计模式(2)--Singleton--单例模式--创建型
1.模式定义: 单例模式确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 2.模式特点: (1)单例类只能有一个实例. (2)单例类必须自己创建自己的唯一实例. (3)单例类必须给所有 ...
- python练习题一
1.使用while循环输出1 2 3 4 5 6 8 9 10 答:i=0 while i<10: i += 1 if i!=7: print(i) 2. ...
- 利用css实现页面加载时旋转动画
有时浏览一些网站时在刚加载页面时候会出现一个滚动动画如下图,特别是对于一些移动端的站点或者混合应用来说应该用户体验会好很多,扒了下页面发现是用css样式控制的,于是把页面以及css样式赋值了下来, h ...
- CSS选择器大汇总
CSS选择器是学习CSS以及Web编程的基础. 整理出常用的CSS选择器,供自己和大家一起学习. 基本选择器 * /*通用元素选择器,匹配页面任何元素(这也就决定了我们很少使用)*/ #id /*id ...
- windows管理命令
执行msi程序 msiexec /package mysql-installer-community-5.7.18.0.msi rem 管理员DOS窗口执行这个命令,开始卸载mysql 杀死进程 ta ...
- redux源码解读
react在做大型项目的时候,前端的数据一般会越来越复杂,状态的变化难以跟踪.无法预测,而redux可以很好的结合react使用,保证数据的单向流动,可以很好的管理整个项目的状态,但是具体来说,下面是 ...
- pickle模块的使用python3
Python的pickle模块实现了基本的数据序列和反序列化.通过pickle模块的序列化操作我们能够将程序中运行的对象信息保存到文件中去,永久存储:通过pickle模块的反序列化操作,我们能够从文件 ...
- k-临近算法学习
本章主要内容: k-临近算法是通过对象本身的特征将对象划分到某一类型中去,比如电影中的题材类型的分类是,可能就会考虑到电影中出现的镜头出现的次数的多少将电影划分为动作电影,爱情电影等等,本次的随笔参考 ...
- Java的HashMap实现原理整理总结
通过Debug 探寻Java-HashMap 实现原理: 一个简单的例子,代码如下, 测试方法 main: public static void main(String[] args) { KeyOb ...