java面向对象高级.ppt

上传人:小飞机 文档编号:6510330 上传时间:2023-11-07 格式:PPT 页数:53 大小:309.99KB
返回 下载 相关 举报
java面向对象高级.ppt_第1页
第1页 / 共53页
java面向对象高级.ppt_第2页
第2页 / 共53页
java面向对象高级.ppt_第3页
第3页 / 共53页
java面向对象高级.ppt_第4页
第4页 / 共53页
java面向对象高级.ppt_第5页
第5页 / 共53页
点击查看更多>>
资源描述

《java面向对象高级.ppt》由会员分享,可在线阅读,更多相关《java面向对象高级.ppt(53页珍藏版)》请在三一办公上搜索。

1、面向对象的高级程序设计,伍淳华北京邮电大学计算机学院,2,面向对象高级程序设计,继承object类,所有类都是Object的子类;Object obj=new BackAccount();Object obj=new String(“Hello”);,3,面向对象高级程序设计,继承object类,equals方法toString方法clone方法在自己编写的类中,最好重写这些方法!,4,面向对象高级程序设计,继承object类,equals方法public boolean equals(Object obj)return(this=obj);判断两个对象是否具有相同的引用,5,面向对象高级程序

2、设计,继承object类,equals方法 class BankAccount public boolean equals(Object obj)BankAccount other=(BankAccount)obj;return(accountNumber=other.accountNumber&balance=other.balance),6,面向对象高级程序设计,继承object类,equals方法 class BankAccount public boolean equals(Object obj)if(this=obj)return true;if(obj=null)return fa

3、lse;if(getClass()!=obj.getClass()return false;BankAccount other=(BankAccount)obj;return(accountNumber=other.accountNumber&balance=other.balance),7,面向对象高级程序设计,继承object类,子类中实现equals方法 首先调用超类的equals,如果未通过测试,对象就不可能相等;如果超类中的域都相等,就比较子类中的实例域;,8,面向对象高级程序设计,继承object类,子类中实现equals方法class SavingAccount extends

4、BankAccount public boolean equals(Object obj)if(!super.equals(obj)return false;SavingAccount other=obj;return/比较SavingAccount中的成员变量,9,面向对象高级程序设计,继承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.equ

5、als(y)返回true,y.equals(z)返回true,那么x.equals(z)也应该返回true;4)一致性:如果x和y引用的对象没有发生变化,那么反复调用x.equals(y)应该返回同样的结果;5)对于任意非空引用x,x.equals(null)应该返回false;,10,面向对象高级程序设计,继承object类,注意:class BankAccount public boolean equals(BankAccount obj)if(this=obj)return true;if(obj=null)return false;if(getClass()!=obj.getClass

6、()return false;return(accountNumber=obj.accountNumber&balance=obj.balance),11,面向对象高级程序设计,继承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(accountNumbe

7、r=other.accountNumber&balance=other.balance),12,面向对象高级程序设计,继承object类,注意:如果子类能够拥有自己的相等概念,那么对称性需求将强制采用getClass进行检测;如果由超类决定相等的概念,则可以使用instanceof进行检测,这样可以在不同子类的对象之间进行相等的比较.,13,面向对象高级程序设计,继承object类,hashCode方法hasCode方法返回一个整型数值,并合理地组合实例域的散列码,以便能够让各个不同的对象产生的散列码更加均匀;如果x.equals(y)返回true,那么x.hashCode()就必须与y.ha

8、shCode()具有相同的值;如果重新定义equals方法,就必须重新定义hashCde方法;Object类的hashCode()方法返回对象的存储地址;,14,面向对象高级程序设计,继承object类,hashCode方法class BankAccountpublic int hashCode()return 7*Integer(accountNumber).hashCode()+11*Double(balance).hashCode();,15,面向对象高级程序设计,继承object类,toString方法 返回对象的字符串表示;Object类中默认返回对象所属的类名和散列码.System

9、.out.println(System.out);输出:java.io.PrintStreama90653,16,面向对象高级程序设计,继承object类,toString方法 重写toString方法一般遵循的格式为:类名成员变量值 java.awt.Pointx=20,y=20BankAccout中的toString函数可改写为:public String toString()retrun“BankAccoutbalance=“+balance+”,accountNumber=“+accountNumber+”;,17,面向对象高级程序设计,继承object类,toString方法publ

10、ic String toString()retrun getClass.getName()+”balance=“+balance+”,accountNumber=“+accountNumber+”;,18,面向对象高级程序设计,继承object类,toString方法class SavingAccount extends BankAccountpublic String toString()retrun super.toString()+”interest=“+interest+”;,19,面向对象高级程序设计,接口,接口代码重用Eg:DataSet,20,面向对象高级程序设计,接口,接口代码

11、重用 如果想计算一组BankAccount对象中余额的最大值和平均值?,21,面向对象高级程序设计,接口,接口代码重用 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

12、 count;,22,面向对象高级程序设计,接口,接口代码重用 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;,23,面向对象高级程序设计,接口,接口代码重用X的数据类型;如果每个对象

13、实现一个getMeasure方法来提供测量的内容,就可实现一个可重用的DataSet,以add()方法为例:sum=sum+x.getMeasure();if(count=0|maximum.getMeasure()x.getMeasure()maximum=x;count+;X的数据类型应该是什么?-X的数据类型可以是任意实现了getMeasure()的类。,24,面向对象高级程序设计,接口,接口代码重用接口可用来规范类的行为public interface Measurabledouble getMeasure();DataSet可以返回一组对象中值最大的那个对象,并计算出这一组对象的平均

14、值,但要求对象所属的类必须实现了Measurable接口。,25,面向对象高级程序设计,接口,接口代码重用接口可用来规范类的行为public interface Measurabledouble getMeasure();DataSet可以返回一组对象中值最大的那个对象,并计算出这一组对象的平均值,但要求对象所属的类必须实现了Measurable接口。,26,面向对象高级程序设计,接口,public class DataSet.public void add(Measurable x)sum=sum+x.getMeasure();if(count=0|maximum.getMeasure()x

15、.getMeasure()maximum=x;count+;public Measurable getMaximum()return maximum;private double sum;private Measurable maximum;private int count;,27,面向对象高级程序设计,接口,接口VS 类接口中所有的方法都是抽象的,即有方法名,方法参数,返回值,但没有方法体;接口中的方法的访问限制权限都是public;接口中没有成员变量,但可以有常量;,28,面向对象高级程序设计,接口,实现接口用关键词implements来标识一个类实现了某个接口;public class

16、 BankAccount implements Measurable public double getMeasure()return balance;/Additional methods and fields 类可以实现多个接口;-类必须完成其实现的所有接口中的所有方法;,29,面向对象高级程序设计,接口,接口使得类和类之间的藕合度减少;Eg:DataSet、BankAccount和Student的UML图-矩形框表示一个类,矩形框中如果有interface表示一个接口;-虚线加上一个空的三角形箭头表示”is-a”关系;-虚线加上一个箭头表示”uses”关系;,30,面向对象高级程序设计,

17、接口,使用接口前的UML图,31,面向对象高级程序设计,接口,使用接口后的UML图,32,面向对象高级程序设计,接口,接口定义语法public interface InterfaceName/method signatures Example:public interface Measurable double getMeasure();注:接口中的方法体自动为public,33,面向对象高级程序设计,接口,类实现接口语法public class ClassName implements InterfaceName,InterfaceName,./methods/instance variab

18、les Example:public class BankAccount implements Measurable/Other BankAccount methods public double getMeasure()/Method implementation,34,面向对象高级程序设计,接口,如果想用DataSet类返回一组Country对象中人口最多的一个对象,Country类应该满足什么条件?可否将DataSet类的 public void add(Measurable x)方法的参数类型改为Object?,35,面向对象高级程序设计,接口,接口和类的互换 DataSet bank

19、Data=new DataSet();bankData.add(new BankAccount(1100);public void add(Measurable x)如果一个类实现了某个接口,则将该类转换为该接口是正确的,而且不需要强制转换;,36,面向对象高级程序设计,接口,接口和类的互换 DataSet bankData=new DataSet();bankData.add(new BankAccount(1100);bankData.add(new BankAccount(2100);bankData.add(new BankAccount(2100);Measurable m=bank

20、Data.getMaxium();m.deposit(3000);/上面的语句是非法的,37,面向对象高级程序设计,接口,接口和类的互换接口转换为某个实现了该接口的类,需要用强制转换 BankAccount m=(BankAccout)bankData.getMaxium();m.deposit(3000);,38,面向对象高级程序设计,接口,接口与多态接口不能实例化Measurable m=new Measuable();/wrong!一个对象只能是实现了该接口的某个类的实例Measurable x;x=new BankAccount(10000);x=new Studnet(“Jack);

21、调用对象的方法 x.getMeasure();?调用了哪个方法,39,面向对象高级程序设计,接口,接口与多态接口可实现运行时的多态,在运行阶段,由对象的实际类型决定调用哪一个具体的方法-如果x是一个BankAccount对象,则调用BankAccount.getMeasure();-如果x是一个Student对象,则调用Student.getMeasure();,40,面向对象高级程序设计,接口,接口与回调(callback)Measurable接口的限制-只能对用户自己编写的类实现该接口,不适用系统自带的类-测量形式比较简单。回调:一种常见的程序设计模式。可以指出某个特定事件发生时应该采取的

22、动作。改写Measurable-在前面的DataSet实现中,测量的实现依赖于调用该方法的对象;-改进:将需要测量的对象传递给一个测量方法:public interface Measurer double measure(Object anObject);,41,class DataSetprivate double sum;private Object maximum;private int count;private Measurer measurer;/添加测量器对象,42,面向对象高级程序设计,接口,修改后的add()方法public void add(Object x)sum=sum

23、+measurer.measure(x);if(count=0|measurer.measure(maximum)measurer.measure(x)maximum=x;count+;,43,面向对象高级程序设计,接口,可以定义一个测量器对相关类的对象进行任何形式的测量public class RectangleMeasurer implements Measurer public double measure(Object anObject)Rectangle aRectangle=(Rectangle)anObject;double area=aRectangle.getWidth()*

24、aRectangle.getHeight();return area;(rectangle是系统自带的类,表示一个矩形),44,面向对象高级程序设计,接口,将测量器传给一个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=(Re

25、ctangle)data.gatMaximum();System.out.println(“Maximum area rectangle=”+max);,45,面向对象高级程序设计,接口,(在面向对象设计时,需要降低类与类之间的耦合性),46,面向对象高级程序设计,接口,示例程序1 DataSetTest,47,面向对象高级程序设计,内部类,对于一些用途很有限的类,可将其放在要使用的方法内;public class DataSetTester public static void main(String args)class RectangleMeasurer implements Measu

26、rer.Measurer m=new RectangleMeasurer();DataSet data=new DataSet(m);.定义在方法体内的内部类,仅对该方法可见,方法体外不可访问.,48,面向对象高级程序设计,内部类,任何定义在其它类内部的类,都是内部类;内部类除了可定义在其它类的方法体内,还可以定义在方法体外;编译器会将内部类编译为一个普通类;DataSetTester$1RectangleMeasure.class,49,面向对象高级程序设计,内部类,定义语法Declared inside a method class OuterClassName method signat

27、ure/方法签名.class InnerClassName/methods/fields.,50,面向对象高级程序设计,内部类,定义语法Declared inside the class class OuterClassName/methods/fields accessSpecifier class InnerClassName/methods/fields.,51,面向对象高级程序设计,内部类,示例DataSetTest3,52,面向对象高级程序设计,作业,完善自己编写的类 1.编写equals()和toString()方法;2.实现接口Measurable()(任选课堂上的一种实现方式)以下为各类的测量标准:学生:年龄;老师:年龄;教室:面积;课程:学分;电脑:价格;仿照示例程序1,完成自己的程序;,Thank You!,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号