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.方法名来调用。