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 作为Shape的子类,使用周长和面积方法无可厚非,但是如果有一个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关系的接口更为合适。接口在细节方面能够更好地体现多态性