(6)掌握对象浅层拷贝与深层拷贝方法;
(7)掌握Lambda表达式语法;
(8)了解内部类的用途及语法要求。
comparator和comparable区别:
3.Java的clone()方法⑴clone方法将对象复制了一份并返回给调用者。一般而言,clone()方法满足:①对任何的对象x,都有x.clone()!=x//克隆对象与原对象不是同一个对象②对任何的对象x,都有x.clone().getClass()==x.getClass()//克隆对象与原对象的类型一样
浅拷贝是指拷贝对象时仅仅拷贝对象本身(包括对象中的基本变量),而不拷贝对象包含的引用指向的对象。深拷贝不仅拷贝对象本身,而且拷贝对象包含的引用指向的所有对象。举例来说更加清楚:对象A1中包含对B1的引用,B1中包含对C1的引用。浅拷贝A1得到A2,A2中依然包含对B1的引用,B1中依然包含对C1的引用。深拷贝则是对浅拷贝的递归,深拷贝A1得到A2,A2中包含对B2(B1的copy)的引用,B2中包含对C2(C1的copy)的引用。
大家先思考一个问题,为什么需要克隆对象?直接new一个对象不行吗?
答案是:克隆的对象可能包含一些已经修改过的属性,而new出来的对象的属性都还是初始化时候的值,所以当需要一个新的对象来保存当前对象的“状态”就靠clone方法了。那么我把这个对象的临时属性一个一个的赋值给我新new的对象不也行嘛?可以是可以,但是一来麻烦不说,二来,大家通过上面的源码都发现了clone是一个native方法,就是快啊,在底层实现的。
提个醒,我们常见的Objecta=newObject();Objectb;b=a;这种形式的代码复制的是引用,即对象在内存中的地址,a和b对象仍然指向了同一个对象。
而通过clone方法赋值的对象跟原来的对象时同时独立存在的。
先介绍一下两种不同的克隆方法,浅克隆(ShallowClone)和深克隆(DeepClone)。
在Java语言中,数据类型分为值类型(基本数据类型)和引用类型,值类型包括int、double、byte、boolean、char等简单数据类型,引用类型包括类、接口、数组等复杂类型。浅克隆和深克隆的主要区别在于是否支持引用类型的成员变量的复制,下面将对两者进行详细介绍。
一般步骤是(浅克隆):
1.被复制的类需要实现Clonenable接口(不实现的话在调用clone方法会抛出CloneNotSupportedException异常),该接口为标记接口(不含任何方法)
2.覆盖clone()方法,访问修饰符设为public。方法中调用super.clone()方法得到需要的复制对象。(native为本地方法)
2、实验内容和步骤
实验1:导入第6章示例程序,测试程序并进行代码注释。
测试程序1:
l编辑、编译、调试运行阅读教材214页-215页程序6-1、6-2,理解程序并分析程序运行结果;
l掌握接口的实现用法;
l掌握内置接口Compareable的用法。
测试程序2:
l编辑、编译、调试以下程序,结合程序运行结果理解程序;
interfaceA
{
doubleg=9.8;
voidshow();
}
classCimplementsA
publicvoidshow()
{System.out.println("g="+g);}
classInterfaceTest
publicstaticvoidmain(String[]args)
Aa=newC();
a.show();
System.out.println("g="+C.g);
测试程序3:
l在elipseIDE中调试运行教材223页6-3,结合程序运行结果理解程序;
l26行、36行代码参阅224页,详细内容涉及教材12章。
l掌握回调程序设计模式;
packagetimer;/**@version1.012015-05-12@authorCayHorstmann*/importjava.awt.*;//要引用ToolKit类importjava.awt.event.*;importjava.util.*;//要引用Date类importjavax.swing.*;//要引用JOptionPane类importjavax.swing.Timer;//要引用Timer类publicclassTimerTest{publicstaticvoidmain(String[]args){ActionListenerlistener=newTimePrinter();//接口不能实例化对象,要用实现该接口的类实例化//每过10秒执行一次Timert=newTimer(1000,listener);t.start();//引用timer类定时执行JOptionPane.showMessageDialog(null,"Quitprogram");//出现对话框提示程序是否停止System.exit(0);//终止程序}}classTimePrinterimplementsActionListener{publicvoidactionPerformed(ActionEventevent){System.out.println("Atthetone,thetimeis"+newDate());Toolkit.getDefaultToolkit().beep();//每一个动作完成后监听器响一次}}
测试程序4:
l调试运行教材229页-231页程序6-4、6-5,结合程序运行结果理解程序;
l掌握对象克隆实现技术;
l掌握浅拷贝和深拷贝的差别。
实验2:导入第6章示例程序6-6,学习Lambda表达式用法。
l调试运行教材233页-234页程序6-6,结合程序运行结果理解程序;
l将27-29行代码与教材223页程序对比,将27-29行代码与此程序对比,体会Lambda表达式的优点。
注:以下实验课后完成
实验3:编程练习
l编制一个程序,将身份证号.txt中的信息读入到内存中;
l按姓名字典序输出人员信息;
l查询最大年龄的人员信息;
l查询最小年龄人员信息;
l输入你的年龄,查询身份证号.txt中年龄与你最近人的姓名、身份证号、年龄、性别和出生地;
l查询人员中是否有你的同乡。
实验4:内部类语法验证实验
实验程序1:
l编辑、调试运行教材246页-247页程序6-7,结合程序运行结果理解程序;
l了解内部类的基本用法。
实验程序2:
l编辑、调试运行教材254页程序6-8,结合程序运行结果理解程序;
l了解匿名内部类的用法。
实验程序3:
l在elipseIDE中调试运行教材257页-258页程序6-9,结合程序运行结果理解程序;
l了解静态内部类的用法。
本次实验我还是不太明白克隆,他主要特点是什么?难道只是为了解决浅层拷贝和深层拷贝查过资料也没看懂,还有就是监听器的使用也还是不太明白,课后会尽量查资料解决的