1. 本周学习总结
2. 书面作业
1.clone方法
1.1 Object对象中的clone方法是被protected修饰,在自定义的类中覆盖clone方法时需要注意什么?
实现克隆必须实现Cloneable接口,如果clone类没有实现Cloneable接口,并调用了Object的clone()方法,那么Object的clone()方法就会抛出CloneNotSupportedException异常。
1.2 自己设计类时,一般对什么样的方法使用protected进行修饰?以作业Shape为例说明。
关键字 | 类内部 | 相同包类 | 不同包类 |
---|---|---|---|
public | 可存取 | 可存取 | 可存取 |
protected | 可存取 | 可存取 | 子类可存取 |
无 | 可存取 | 可存取 | 不可存取 |
private | 可存取 | 不可存取 | 不可存取 |
当方法不需要被不同包、非子类的类使用时可以用protected
修饰。
作业Shape
中,shape
的周长和面积对于不同的shape("Circle or Rectangle or other is a Shape")
有着相同的意义,shape
作为Shap
e的子类,使用周长和面积方法无可厚非,但是如果有一个Person
类(八竿子打不着的、不同包类),对其权限就得限定,此时用protected
正合适.
1.3 在test1包中编写简单的Employee类,在test2包中新建一个TestProtected类,并在main中尝试调用test1包中的Employee的clone方法克隆一个新对象,能否成功?为什么?
package test1;
public class Employee implements Cloneable{
public Employee() {
super();
// TODO Auto-generated constructor stub
}
@Override
protected Object clone() throws CloneNotSupportedException {
// TODO Auto-generated method stub
return super.clone();
}
}
package test2;
import test1.Employee;
public class TestProtected {
public static void main(String[] args) {
Employee e=new Employee();
Employee em=e.clone();
}
}
并不能成功clone,提示不可见,简单来说权限不够
2.使用匿名类与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
3.分析下列代码,回答shapeComparator所指向的对象与Comparator接口有什么关系?
Comparator<Shape> shapeComparator = new Comparator<Shape>() {
@Override
public int compare(Shape o1, Shape o2) {
//你的代码
}
};
实现Comparator
接口,并重写接口中的抽象方法
4.GUI中的事件处理
4.1 写出事件处理模型中最重要的几个关键词。
事件:用户在GUI组件上进行的操作,比如敲击键盘 、点击鼠标或者是关闭窗口之类的动作。
事件源:能够产生事件的GUI组件对象,如按钮、文本框这些。
事件监听器:每种事件类都有一个负责监听这种事件的接口,接口中定义了处理该事件的抽象方法。
事件适配器:定义事件监听器的时候可以继承这个适配器,并重写部分所需要的方法,而不需要定义所有的抽象方法。
4.2 使用代码与注释,证明你理解了事件处理模型。
事件-->事件源-->事件监听器
private class KeyMonitor extends KeyAdapter {//事件监听器
public void keyReleased(KeyEvent e) {//按键弹起
myTank.keyReleased(e);//Tank作出相应的停止动作
}
public void keyPressed(KeyEvent e) {//按下按键
myTank.keyPressed(e);//Tank作出相应的方向移动
}
}
3. 码云上代码提交记录及PTA实验总结
3.1. 码云代码提交记录
3.2. PTA实验总结
(1)用数组实现栈,对于栈元素个数有特殊限制,必须要先定义才能使用,且不能超出这个个数。如果改用ArrayList的话,可以实现随时添加的功能,而不是局限于有限个数。
(2)接口的实现,相比于继承,更灵活,继承时需满足is-a的关系,如有有一个Person has-a swim 属性,Fish has-a swim 属性,但是Person和Fish明显不是“同类”,所以采用has-a关系的接口更为合适。接口在细节方面能够更好地体现多态性