面向对象的高级程序设计.ppt_第1页
面向对象的高级程序设计.ppt_第2页
面向对象的高级程序设计.ppt_第3页
面向对象的高级程序设计.ppt_第4页
面向对象的高级程序设计.ppt_第5页
已阅读5页,还剩56页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

面向对象的高级程序设计,伍淳华 北京邮电大学计算机学院,java,面向对象高级程序设计,继承object类,所有类都是object的子类; object obj=new backaccount(); object obj=new string(“hello”);,java,面向对象高级程序设计,继承object类,equals方法 tostring方法 clone方法 在自己编写的类中,最好重写这些方法!,java,面向对象高级程序设计,继承object类,equals方法 public boolean equals(object obj) return (this = obj); 判断两个对象是否具有相同的引用,java,面向对象高级程序设计,继承object类,equals方法 class bankaccount public boolean equals(object obj) bankaccount other=(bankaccount)obj; return (accountnumber=other.accountnumber & balance=other.balance) ,java,面向对象高级程序设计,继承object类,equals方法 class bankaccount public boolean equals(object obj) if(this=obj) return true; if(obj=null) return false; if(getclass()!=obj.getclass() return false; bankaccount other=(bankaccount)obj; return (accountnumber=other.accountnumber & balance=other.balance) ,java,面向对象高级程序设计,继承object类,子类中实现equals方法 首先调用超类的equals,如果未通过测试,对象就不可能相等; 如果超类中的域都相等,就比较子类中的实例域;,java,面向对象高级程序设计,继承object类,子类中实现equals方法 class savingaccount extends bankaccount public boolean equals(object obj) if(!super.equals(obj) return false; savingaccount other=obj; return /比较savingaccount中的成员变量 ,java,面向对象高级程序设计,继承object类,java语言规范要求equals方法具有下面的特性 1)自反性:对于任何非空引用x,x.equals(x)应该返回true; 2)对称性:对于任何引用x和y,如果x.equals(y)返回true,那么y.equals(x)也应该返回true; 3)传递性:对于任何引用x,y,z,如果x.equals(y)返回true,y.equals(z)返回true,那么x.equals(z)也应该返回true; 4)一致性:如果x和y引用的对象没有发生变化,那么反复调用x.equals(y)应该返回同样的结果; 5)对于任意非空引用x,x.equals(null)应该返回false;,java,面向对象高级程序设计,继承object类,注意: class bankaccount public boolean equals(bankaccount obj) if(this=obj) return true; if(obj=null) return false; if(getclass()!=obj.getclass() return false; return (accountnumber=obj.accountnumber & balance=obj.balance) ,java,面向对象高级程序设计,继承object类,注意: class bankaccount public boolean equals(object obj) if(this=obj) return true; if(obj=null) return false; if(!(obj instanceof bankaccount) return false; bankaccout other=(bankaccount) obj; return (accountnumber=other.accountnumber & balance=other.balance) ,java,面向对象高级程序设计,继承object类,注意: 如果子类能够拥有自己的相等概念,那么对称性需求将强制采用getclass进行检测; 如果由超类决定相等的概念,则可以使用instanceof进行检测,这样可以在不同子类的对象之间进行相等的比较.,java,面向对象高级程序设计,继承object类,hashcode方法 hascode方法返回一个整型数值,并合理地组合实例域的散列码,以便能够让各个不同的对象产生的散列码更加均匀; 如果x.equals(y)返回true,那么x.hashcode()就必须与y.hashcode()具有相同的值; 如果重新定义equals方法,就必须重新定义hashcde方法; object类的hashcode()方法返回对象的存储地址;,java,面向对象高级程序设计,继承object类,hashcode方法 class bankaccount public int hashcode() return 7*integer(accountnumber).hashcode() +11*double(balance).hashcode(); ,java,面向对象高级程序设计,继承object类,tostring方法 返回对象的字符串表示; object类中默认返回对象所属的类名和散列码. system.out.println(system.out); 输出:java.io.printstreama90653,java,面向对象高级程序设计,继承object类,tostring方法 重写tostring方法一般遵循的格式为: 类名成员变量值 java.awt.pointx=20,y=20 bankaccout中的tostring函数可改写为: public string tostring() retrun “bankaccoutbalance=“+balance+ ”,accountnumber=“+accountnumber+”; ,java,面向对象高级程序设计,继承object类,tostring方法 public string tostring() retrun getclass().getname()+”balance=“+balance+”,accountnumber=“+accountnumber+”; ,java,面向对象高级程序设计,继承object类,tostring方法 class savingaccount extends bankaccount public string tostring() retrun super.tostring()+”interest=“+interest+”; ,java,面向对象高级程序设计,接口,接口代码重用 eg : dataset,java,面向对象高级程序设计,接口,接口代码重用 如果想计算一组bankaccount对象中余额的最大值和平均值?,java,面向对象高级程序设计,接口,接口代码重用 public class dataset . . . public void add(bankaccount x) sum = sum + x.getbalance(); if (count = 0 | maximum.getbalance() x.getbalance() maximum = x; count+; public bankaccount getmaximum() return maximum; private double sum; private bankaccount maximum; private int count; ,java,面向对象高级程序设计,接口,接口代码重用 public class dataset . . . public void add(student x) sum = sum + x.getscore(); if (count = 0 | maximum.getscore() x.getbalance() maximum = x; count+; public student getmaximum() return maximum; private double sum; private student maximum; private int count; ,java,面向对象高级程序设计,接口,接口代码重用 x的数据类型; 如果每个对象实现一个getmeasure方法来提供测量的内容,就可实现一个可重用的dataset,以add()方法为例: sum = sum + x.getmeasure(); if (count = 0 | maximum.getmeasure() x.getmeasure() maximum = x; count+; x的数据类型应该是什么? -x的数据类型可以是任意实现了getmeasure( )的类。,java,面向对象高级程序设计,接口,接口可用来规范类的行为,只包含常量和方法的定义,而没有变量和方法的实现。 接口的定义 接口的定义包括接口声明和接口体 完整的接口声明: public interface interfacenameextends listofsuperinterface 接口体包括常量定义和方法定义 -常量定义格式为:type name=value; 该常量被实现该接口的多个类共享;缺省的具有public ,final, static的属性。 -方法体定义格式为:(缺省的具有 public和abstract属性) returntype methodname(paramlist);,java,面向对象高级程序设计,接口,接口的定义 example: public interface measurable double getmeasure(); ,java,面向对象高级程序设计,接口,接口的实现 在类的声明中用implements子句来表示一个类实现某个接口 一个类可以实现多个接口,在implements子句中用逗号分开 在类体中可以使用接口中定义的常量,必须实现接口中定义的所有方法。,java,面向对象高级程序设计,接口,接口的实现 例: public class bankaccount implements measurable / other bankaccount methods public double getmeasure() / method implementation ,java,面向对象高级程序设计,接口,接口类型的使用 接口作为一种引用类型来使用 可以声明接口的一个变量,但不能实例化 measurable m=new measurable(); /wrong 接口可以指向任何实现该接口的类的实例; measurable m=new bankaccount(); 通过这些接口变量可以访问类所实现的接口中的方法。,java,面向对象高级程序设计,接口,接口代码重用 public interface measurable double getmeasure(); ,java,面向对象高级程序设计,接口,public class dataset . . . public void add(measurable x) sum = sum + x.getmeasure(); if (count = 0 | maximum.getmeasure() x.getmeasure() maximum = x; count+; public measurable getmaximum() return maximum; private double sum; private measurable maximum; private int count; ,java,面向对象高级程序设计,接口,dataset可以返回一组对象中值最大的那个对象,并计算出这一组对象的平均值,但要求对象所属的类必须实现了measurable接口。,java,面向对象高级程序设计,接口,public class datasettester public static void main(string args) dataset bankdata = new dataset(); bankdata.add(new bankaccount(0); bankdata.add(new bankaccount(10000); bankdata.add(new bankaccount(2000); system.out.println(“average balance = “ + bankdata.getaverage(); measurable max = bankdata.getmaximum(); system.out.println(“highest balance = “ + max.getmeasure(); ,java,面向对象高级程序设计,接口,接口vs 类 接口中所有的方法都是抽象的,即有方法名,方法参数,返回值,但没有方法体; 接口中的方法的访问限制权限都是public; 接口中没有成员变量,但可以有常量;,java,面向对象高级程序设计,接口,接口使得类和类之间的藕合度减少; eg: dataset、bankaccount和student的uml图 -矩形框表示一个类,矩形框中如果有interface表示一个接口; -虚线加上一个空的三角形箭头表示”is-a”关系; -虚线加上一个箭头表示”uses”关系;,java,面向对象高级程序设计,接口,使用接口前的uml图,java,面向对象高级程序设计,接口,使用接口后的uml图,java,面向对象高级程序设计,接口,如果想用dataset类返回一组country对象中人口最多的一个对象,country类应该满足什么条件? 可否将dataset类的 public void add(measurable x)方法的参数类型改为object?,java,面向对象高级程序设计,接口,接口和类的互换 dataset bankdata=new dataset(); bankdata.add(new bankaccount(1100); public void add(measurable x) 如果一个类实现了某个接口,则将该类转换为该接口是正确的,而且不需要强制转换;,java,面向对象高级程序设计,接口,接口和类的互换 dataset bankdata=new dataset(); bankdata.add(new bankaccount(1100); bankdata.add(new bankaccount(2100); bankdata.add(new bankaccount(2100); measurable m=bankdata.getmaxium(); m.deposit(3000); /上面的语句是非法的,java,面向对象高级程序设计,接口,接口和类的互换 接口转换为某个实现了该接口的类,需要用强制转换 bankaccount m=(bankaccout)bankdata.getmaxium(); m.deposit(3000);,java,面向对象高级程序设计,接口,接口与多态 接口不能实例化 measurable m=new measuable(); /wrong! 一个对象只能是实现了该接口的某个类的实例 measurable x; x = new bankaccount(10000); x = new studnet( “jack“); 调用对象的方法 x.getmeasure(); ?调用了哪个方法,java,面向对象高级程序设计,接口,接口与多态 接口可实现运行时的多态,在运行阶段,由对象的实际类型决定调用哪一个具体的方法 -如果x是一个bankaccount对象,则调用bankaccount.getmeasure(); -如果x是一个student对象,则调用student.getmeasure();,java,面向对象高级程序设计,接口,接口与回调(callback) measurable接口的限制 -只能对用户自己编写的类实现该接口。 -测量形式比较简单。 回调:一种常见的程序设计模式。可以指出某个特定事件发生时应该采取的动作。 改写measurable -在前面的dataset实现中,测量的实现依赖于调用该方法的对象; -改进:将需要测量的对象传递给一个测量方法: public interface measurer double measure(object anobject); ,java,面向对象高级程序设计,接口,class dataset private double sum; private object maximum; private int count; private measurer measurer;/添加测量器对象 ,java,面向对象高级程序设计,接口,修改后的add() 方法 public void add(object x) sum = sum + measurer.measure(x); if (count = 0 | measurer.measure(maximum) measurer.measure(x) maximum = x; count+; ,java,面向对象高级程序设计,接口,可以定义一个测量器对相关类的对象进行任何形式的测量 public class rectanglemeasurer implements measurable public double measure(object anobject) rectangle arectangle = (rectangle) anobject; double area = arectangle.getwidth() * arectangle.getheight(); return area; ,java,面向对象高级程序设计,接口,将测量器传给一个dataset对象 measurer m = new rectanglemeasurer(); dataset data = new dataset(m); data.add(new rectangle(5, 10, 20, 30); data.add(new rectangle(10, 20, 30, 40); system.out.println(“average area = “ + data.getaverage(); rectangle max = (rectangle) data.getmaximum(); system.out.println(“maximum area rectangle = “ + max); . . .,java,面向对象高级程序设计,接口,示例程序1 datasettest,java,面向对象高级程序设计,接口,java,面向对象高级程序设计,内部类,对于一些用途很有限的类,可将其放在要使用的方法内; public class datasettester public static void main(string args) class rectanglemeasurer implements measurer . . . measurer m = new rectanglemeasurer(); dataset data = new dataset(m); . . . 定义在方法体内的内部类,仅对该方法可见,方法体外不可访问.,java,面向对象高级程序设计,内部类,任何定义在其它类内部的类,都是内部类; 内部类除了可定义在其它类的方法体内,还可以定义在方法体外; 编译器会将内部类编译为一个普通类; datasettester$1rectanglemeasure.class,java,面向对象高级程序设计,内部类,定义语法 declared inside a method class outerclassname method signature . . . class innerclassname / methods / fields . . . . . . ,java,面向对象高级程序设计,内部类,定义语法 declared inside the class class outerclassname / methods / fields accessspecifier class innerclassname / methods / fields . . . ,java,面向对象高级程序设计,内部类,示例

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论