201521123107 《Java程序设计》第6周学习总结

时间:2024-03-21 13:02:50

第6周作业-接口、内部类与Swing


1.本周学习总结

201521123107 《Java程序设计》第6周学习总结

2.书面作业

1.clone方法

1.1 Object对象中的clone方法是被protected修饰,在自定义的类中覆盖clone方法时需要注意什么?

public class Object  {
protected native Object clone() throws CloneNotSupportedException;
}

  在源代码中关于clone方法的定义如上,Object类中的 clone()方法被protected修饰符修饰。这也意味着如果要应用 clone()方 法,必须继承Object类。如果是为了让其它自己定义的类能调用这个clone()方法,重载之后要把clone()方法的属性设置为 public

1.2 自己设计类时,一般对什么样的方法使用protected进行修饰?以作业Shape为例说明。

  在我看来呢,需要被其他子类共用的方法可以用protected进行修饰。以做过的shape来说吧,Circle类和Rectangle类都需要求面积和周长,所以getarea()getPerimeter()方法就是他们共有的方法,因此该方法可以用protected进行修饰。

1.3 在test1包中编写简单的Employee类,在test2包中新建一个TestProtected类,并在main中尝试调用test1包中的Employee的clone方法克隆一个新对象,能否成功?为什么?

package test1;

public class Employee implements Cloneable{
private String name;
private int age;
private double salary; public Employee(String name, int age, double salary) {
super();
this.name = name;
this.age = age;
this.salary = salary;
} @Override
protected Employee clone() throws CloneNotSupportedException {
// TODO Auto-generated method stub
return (Employee) super.clone();
} }
package test2;
import test1.*; public class TestProtected {
Employee employee = new Employee("Tom", 26, 3500);
Employee employee1 = employee.clone();
}

  这样做并不能够成功,编译器会报这样一个错:201521123107 《Java程序设计》第6周学习总结,意思是clone()方法是不可见的,因为修饰该方法的是protected。我们知道protected修饰的方法仅在test1包中可见,对于test2包是不可见的,如果需要在test2包中使用的话,需要将clone()方法用public修饰。

2.使用匿名类与Lambda表达式改写题集面向对象2-进阶-多态接口内部类的题目5-2

仅需粘贴关键代码与运行结果,图片不要太大。


匿名类改写部分:

201521123107 《Java程序设计》第6周学习总结

Lambda表达式改写部分:

201521123107 《Java程序设计》第6周学习总结

运行结果:

201521123107 《Java程序设计》第6周学习总结

3.分析下列代码,回答shapeComparator所指向的对象与Comparator接口有什么关系?

Comparator<Shape> shapeComparator = new Comparator<Shape>() {
@Override
public int compare(Shape o1, Shape o2) { //你的代码 }
};

  shapeComparator所指向的对象是一个Shape类实现的Comparable接口,实现Comparable接口之后可以进行比较。

4.GUI中的事件处理

4.1 写出事件处理模型中最重要的几个关键词。


  事件:敲击键盘或点击鼠标这样的行为操作,一般继承自java.util.EventObject类;

  事件源:事件发生的地方,由于事件源的某项属性或状态发生了改变(比如Button被单击、Textbox的值发生改变等等)导致某项事件发生。

  监听器:实现java.awt.event.ActionListener接口,注册在事件源上,当事件源的属性或状态改变时,取得相应的监听器调用其内部的方法。

4.2 使用代码与注释,证明你理解了事件处理模型。

就使用老师上课课件中的代码来添加一些注释吧:

package test;

import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton; public class EventMainGUI1 extends Frame {
static int count = 1; public EventMainGUI1(String title) {
super(title);
} public static void main(String args[]) {
//初始化了一个叫做“hello”的窗口
EventMainGUI1 f = new EventMainGUI1("hello");
f.setLayout(new FlowLayout());
//定义了一个不可变的按钮b,并赋上初始值1,按钮b就是一个事件源
final JButton b = new JButton("1");
//注册监听器,每当b被按下的时候,按钮上的值就加1(也就是当事件源的状态被改变后,监听器就会调用其内部的方法,此时的内部方法就是使按钮b的初始值自增1)
b.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
b.setLabel(new Integer(++count).toString());
}
});
f.add(b);//向窗口f中加入b按钮
f.setSize(100, 100);
f.setBackground(Color.blue);
f.setVisible(true);//设置窗口可以被看见
}
}

5.结对编程:面向对象设计(大作业2-非常重要,未完成-2)

继续完善上周的项目作业。考核点如下:

5.1 尝试使用图形界面改写。


登录界面关键代码:

private void LoginButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_LoginButtonActionPerformed
String a = nameTextField.getText();
String b = passTextField.getText();
if(a.equals(b)){
Tips.setText("Login successfully!");
new Shoppingcart().setVisible(true);
this.setVisible(false);
}
else
Tips.setText("Login failed , try another name or password");
}//GEN-LAST:event_LoginButtonActionPerformed

登录界面:

(1)密码正确,就弹出购物界面

201521123107 《Java程序设计》第6周学习总结

(2)密码错误,就提示出错

201521123107 《Java程序设计》第6周学习总结

购物界面关键代码:

201521123107 《Java程序设计》第6周学习总结

201521123107 《Java程序设计》第6周学习总结

购物界面:

201521123107 《Java程序设计》第6周学习总结

201521123107 《Java程序设计》第6周学习总结

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

201521123107 《Java程序设计》第6周学习总结

5.3 与上周相比,项目的主要改动是什么?

  这次的任务分配:

  201521123107 张翔 主要负责具体代码的添加

  201521123084 林正晟 负责构建图形界面

  上周的购物车我们没有加入登陆界面,所以这次我们新增了一个登陆界面。原计划呢,我们是商品界面与购物车分别做一个窗体,结果我们在做的时候缺乏沟通,这是一个很大的忌讳。伙伴图形界面做好了,我对着界面表示无奈,根本无从下手,导致最后将购物车和商品界面混在一起。当我想把整个界面推倒重做的时候,发现有些难度,所以我们只能将原来的购物车界面改为商品界面,然后把需要购买商品的数量、总价都合到了同一个界面上。

  总的来说,这次合作编程的失败在于两个人缺乏对于根据上一次代码的图形界面设想的沟通,导致了界面做出来了,不知道要往什么地方编写自己的代码,不过我们还是有值得肯定的地方,我们的登陆界面实现的还是比较成功。

3.使用码云管理Java代码

本周Commit历史截图

201521123107 《Java程序设计》第6周学习总结

4.PTA实验

实验总结

  这次的实验有两题,本来是上机课就可以完成的,但是因为程序里有很多地方需要调试,所以没来得及给老师检查。

  第一题我认为最核心的部分就是用数组实现栈的功能。定义IntegerStack的实现类ArrayIntegerStack,内部使用数组实现,所有的方法实现都是为了数组服务的,总体上难度不算大,困住我最久的是入栈。样例输入是输入三个,但我一直入栈只有两个数,第3个数字一直没有入栈,后来发现是多吃了一个空格,导致第三个数字的位置被空格占据没能入栈。还有就是数次的答案错误(已经是自己见怪不怪的老问题了),答案都对就是过不了,发现是自己少使用Arrays.toString()输出内部数组中的值。

  第二题较第一题更简单一些。遇到最大的问题是PairResult findMinMax(double[] values)中返回值的问题,我一直无法将找到的最大和最小值返回。起初以为是取值的问题,第一次发现确实是取最值的方法有误,修正过方法后发现值并没有被返回,发现需要return PairResult(min,max)才能将最值返回。