工学java语言程序设计第三版清华第5章ppt课件_第1页
工学java语言程序设计第三版清华第5章ppt课件_第2页
工学java语言程序设计第三版清华第5章ppt课件_第3页
工学java语言程序设计第三版清华第5章ppt课件_第4页
工学java语言程序设计第三版清华第5章ppt课件_第5页
已阅读5页,还剩116页未读 继续免费阅读

下载本文档

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

文档简介

第5章 接口与多态 Java 2 实用教程-4.13 Programming in JAVA 1 清华大学 郑莉JAVA语言程序设计 目录 l5.1 接口 l5.2 塑型 l5.3 多态的概念 l5.4 多态的应用 l5.5 构造方法与多态 l5.6 内部类 l5.7 本章小结 2 清华大学 郑莉JAVA语言程序设计 5.1 接口 lJava不支持多继承性,即一个类只能有一 个父类,Java程序中类的层次结构为树状 结构 l单继承使Java程序简单,易于管理 l如果有不相干的类之间有共同的属性和功 能,能否处理?如何处理? 3 清华大学 郑莉JAVA语言程序设计 l各种图形都需要实现绘图方法,可在它们 的抽象父类中声明一个draw抽象方法 abstract class GraphicObject int x, y; void moveTo(int newX, int newY) . . . abstract void draw(); 比较抽象类 抽象类 4 清华大学 郑莉JAVA语言程序设计 l然后在每一个子类中重写draw方法, 例如: class Circle extends GraphicObject void draw() . . . class Rectangle extends GraphicObject void draw() . . . 抽象类 5 清华大学 郑莉JAVA语言程序设计 机动车 轿车 拖拉机摩托车 abstract Charge() abstract ContruoTemperature() 一个抽象类的子类如果不是抽象类,则它必须为父类 中的所有抽象方法书写方法体,即重写父类中的所有 抽象方法 6 清华大学 郑莉JAVA语言程序设计 l接口允许我们在看起来不相干的对象之间 定义共同行为 5.1.1 接口的作用及语法 与抽象类的不同 接口 interface Tempreture 7 清华大学 郑莉JAVA语言程序设计 l什么是接口 在实际中,不相关的类有时会有相同的属性和功 能,可将这些属性和功能组织成相对独立的集合,凡 是需要这种特定功能的类,均可以实现这个集合,该 集合被称为接口。利用接口Java可以实现类似多继承 的网状结构 可将接口想象为一个“纯”抽象类。它允许创建者 规定一个类的基本形式:方法名、参数列,但不规定 方法主体 也可以包含基本数据类型的数据成员,但它们都默 认为static和final,一定要赋予初值;方法默认为 public abstract 8 清华大学 郑莉JAVA语言程序设计 5.1.1 接口的作用及语法 l接口的作用 是面向对象的一个重要机制 实现多继承,同时免除C+中的多继承那 样的复杂性 用来定制一个规范, 建立类和类之间的“协 议” l把类根据其实现的功能来分别代表,而不 必顾虑它所在的类继承层次;这样可以最大限度地 利用动态绑定,隐藏实现细节 l实现不同类之间的常量共享 一个接口只有方法的特征没有方法的实现 ,因此这些方法可以在不同的地方被不同的类 实现,而这些实现可以具有不同的行为(功能 ) 接口 9 清华大学 郑莉JAVA语言程序设计 public interface 收费 public void 收取费用(); public interface 调节温度 public void controlTemperature(); public class 公共汽车 implements 收费 public void 收取费用() System.out.println(“公共汽车:一元/张,不计算公里数“); public class 出租车 implements 收费, 调节温度 public void 收取费用() System.out.println(“出租车:1.60元/公里,起价3公里“); public void controlTemperature() System.out.println(“安装了Hair空调“); 返回 10 清华大学 郑莉JAVA语言程序设计 l保险公司的例子 具有车辆保险、人员保险、公司保险等多种保险业 务,在对外提供服务方面具有相似性,如都需要计算保 险费(premium)等,因此可声明一个Insurable 接口 在UML图中,实现接口用带有空三角形的虚线表示 5.1.1 接口的作用及语法 例5_1 Insurable CompanyPersonCar 接口 11 清华大学 郑莉JAVA语言程序设计 l接口的语法 声明格式为 接口修饰符 interface 接口名称 extends 父接口名 /方法的原型声明或静态常量 接口的数据成员一定要赋初值,且此值将不 能再更改,允许省略final关键字 接口中的方法必须是“抽象方法”,不能有方 法体,允许省略public及abstract关键字 5.1.1 接口的作用及语法 接口 12 清华大学 郑莉JAVA语言程序设计 l声明一个接口Shape2D,可利用它来实现二维的 几何形状类Circle和Rectangle 把计算面积的方法声明在接口里 pi值是常量,把它声明在接口的数据成员里 interface Shape2D /声明Shape2D 接口 final double pi=3.14; /数据成员一定 要初始化 public abstract double area(); /抽象方法 在接口的声明中,由于只有常量的定义和public的 abstract方法定义,允许省略一些关键字,也可声明如 下 interface Shape2D double pi=3.14; double area(); 5.1.1 接口的作用及语法 例5_2 接口 13 清华大学 郑莉JAVA语言程序设计 l例5.1中的Insurable 接口声明如下, 可见其中的方法都是抽象方法 public interface Insurable public int getNumber(); public int getCoverageAmount(); public double calculatePremium(); public Date getExpiryDate(); 5.1.1 接口的作用及语法 例5_1保险接口的声明 接口 14 清华大学 郑莉JAVA语言程序设计 5.1.2 实现接口 l接口的实现 接口不能用new运算符直接产生对象,必 须利用其特性设计新的类,再用新类来创建对 象 利用接口设计类的过程,称为接口的实现 ,使用implements关键字 语法如下 public class 类名称 implements 接口名 称 /* Bodies for the interface methods */ /* Own data and methods. */ l必须实现接口中的所有方法 l来自接口的方法必须声明成public 接口 15 清华大学 郑莉JAVA语言程序设计 5.1.2 实现接口 例5_4 class Circle implements Shape2D double radius; public Circle(double r) radius=r; public double area() return (pi * radius * radius); class Rectangle implements Shape2D int width,height; public Rectangle(int w,int h) width=w; height=h; public double area() return (width * height); l声明Circle与Rectangle两个类实现Shape2D接口 接口 interface Shape2D final double pi=3.14; public abstract double area(); 16 清华大学 郑莉JAVA语言程序设计 l测试类 public class InterfaceTester public static void main(String args) Rectangle rect=new Rectangle(5,6); System.out.println(“Area of rect = “ + rect.area(); Circle cir=new Circle(2.0); System.out.println(“Area of cir = “ + cir.area(); l运行结果 Area of rect = 30.0 Area of cir = 12.56 5.1.2 实现接口 例5_4运行 结果 接口 17 清华大学 郑莉JAVA语言程序设计 5.1.2 实现接口(补充 ) l1、类在实现接口方法时,一定要使用public进行 修饰; l2、类实现的接口方法以及接口中的常量可以被 类的对象调用,而且常量可以用类名或接口名直 接调用(为什么?) 例子:Example4_25.java l3、如果一个类使用了某个接口,那么这个类必 须实现该接口的所有方法,即为这些方法提供方 法体。如果没有实现所有的方法,则该类必须是 abstract类。 l例子:见后 18 清华大学 郑莉JAVA语言程序设计 interface Computable int MAX=100; int f(int x); void speak(String s); abstract class comp1 implements Computable int number; public int f(int x) int sum=0; for(int i=1;i Insurable 5.2.1 塑型的概念 一个例 子 塑型 46 清华大学 郑莉JAVA语言程序设计 5.2.1 塑型的概念 塑型的方式 隐式(自动)的类型转换 l基本数据类型,相容类型之间存储容量低的 自动向存储容量高的类型转换; l引用变量,当一个类需要被塑型为更一般的 类(父类、接口)时,系统自动转型。 Employee emp; emp = new Manager(); Car jetta = new Car(); Insurable item= jetta; 显式(强制)的类型转换 l当隐式转换不可能时,进行强制转换 将Manager类型的对象直接赋给Employee 类的引用变量,系统自动塑型,将Manager类 塑型为Employee类 1、基本数据类型的强制转换 (int) 12.232 /12 (char)65 /A 2、引用类型的强制转换 Employee emp Manager man; emp = new Manager(); /再将emp强制转换为Manager类型 man = (Manager)emp; 47 清华大学 郑莉JAVA语言程序设计 5.2.2 塑型的应用 l塑型应用的场合包括 赋值转换 l赋值号右边的表达式类型或对象转换为左边 的类型 方法调用转换 l实参的类型转换为形参的类型(如:回调) 算数表达式转换 l算数混合运算时,不同类型的项转换为相同 的类型再进行运算 字符串转换 l字符串连接运算时,如果一个操作数为字符 串,一个操作数为数值型,则会自动将数值型转换为 字符串 塑型 48 清华大学 郑莉JAVA语言程序设计 l当一个类对象被塑型为其父类后,它提供的方法 会减少 当Manager对象被塑型为Employee之后,它只能 接收getName()及getEmployeeNumber()方法,不能 接收getSalary()方法 将其塑型为本来的类型后,又能接收getSalary()方 法了 5.2.2 塑型的应用 塑型 49 清华大学 郑莉JAVA语言程序设计 5.2.3 方法的查找 l如果在塑型前和塑型后的类中都提供 了相同的方法,如果将此方法发送给 塑型后的对象,那么系统将会调用哪 一个类中的方法? 实例方法的查找 类方法的查找 塑型 50 清华大学 郑莉JAVA语言程序设计 l对于实例方法从对象创建创建时的原始类开始 ,沿类层次向上查找 Manager man = new Manager(); Employee emp1 = new Employee(); Employee emp2 = (Employee)man; / emp2=new Manger(); putePay(); / 调用Employee类中的computePay()方法 putePay(); / 调用Manager类中的computePay()方法 putePay(); / 调用Manager类中的computePay()方法 5.2.3 方法的查找 实例方法的 查找 塑型 51 清华大学 郑莉JAVA语言程序设计 l对于类方法,总是在引用变量声明时所属 的类中进行查找 Manager man = new Manager(); Employee emp1 = new Employee(); Employee emp2 = (Employee)man; man.expenseAllowance(); /in Manager emp1.expenseAllowance(); /in Employee emp2.expenseAllowance(); /in Employee! 5.2.3 方法的查找 类方法 的查找 塑型 52 清华大学 郑莉JAVA语言程序设计 class Teacher protected String name; public String Teaching (String className) return “正在教小学“+className; public int Year (int y) return y; class Professor extends Teacher public String Teaching (String className) return “正在教大学“+className; 53 清华大学 郑莉JAVA语言程序设计 public class Demo public static void main(String args) Professor p=new Professor(); Teacher t=(Teacher)p; /t成为p的上转对象 System.out.println (p.Teaching(“语文“); /继承父类方法 System.out.println (t.Teaching(“数学”); /调用Professor中的方法 System.out.println (“教书年限“+t.Year(10); /继承父类方法 输出结果: 正在教大学语文 正在教大学数学 教书年限10 将Professor类型的对象直接赋给Teacher 类的引用变量,系统自动塑型,将Professor类 塑型为Teacher类 54 清华大学 郑莉JAVA语言程序设计 class Teacher protected String name; public static String Teaching (String className) return “正在教小学“+className; public int Year (int y) return y; class Professor extends Teacher public static String Teaching (String className) return “正在教大学“+className; 55 清华大学 郑莉JAVA语言程序设计 public class Demo public static void main(String args) Professor p=new Professor(); Teacher t=(Teacher)p; /t成为p的上转对象 System.out.println (p.Teaching(“语文“); /继承父类方法 System.out.println (t.Teaching(“数学”); /调用Teacher中的方法 System.out.println (“教书年限“+t.Year(10); /继承父类方法 输出结果: 正在教大学语文 正在教小学数学 教书年限10 将Professor类型的对象直接赋给Teacher 类的引用变量,系统自动塑型,将Professor类 塑型为Teacher类 56 清华大学 郑莉JAVA语言程序设计 5.3 多态的概念 l多态 多态性是指不同类型的对象可以响应相同的消息。 如:父类的某个方法被其子类重写时,可以各自产生自 己的功能行为 . 当一个类有很多子类时,并且这些子类都重写了父 类中的某个方法。当把子类创建的对象的引用放到一个 父类的对象中时,就得到了该对象的一个上转型对象, 这个上转的对象在调用这个方法时就可能具有多种形态 ,因为不同子类在重写父类方法时可能产生不同的行为 。 例如 l所有的Object类的对象都响应toString()方法 l所有的BankAccount类的对象都响应deposit() 方法 57 清华大学 郑莉JAVA语言程序设计 class 动物 void cry() System.out.print(“发出声“); class 狗 extends 动物 void cry() System.out.println(“汪汪 .“); class 猫 extends 动物 void cry() System.out.println(“喵喵 .“); class Example4_20 public static void main(String args) 动物 dongwu; /将子类创建的对象放到父类中 dongwu=new 狗(); dongwu.cry(); dongwu=new 猫(); dongwu.cry(); 58 清华大学 郑莉JAVA语言程序设计 5.3.1 多态的目的 l多态的目的 所有的对象都可被塑型为相同的类型,响 应相同的消息。即,可将对象当作其基类对象 对待。这样,从相同的基类派生出来的多个类 型可被当着同一种类型对待,可对不同的类型 进行同样的处理。 派生类对象响应同一方法时的行为是不一 样的。如何知道派生类调用的方法,这需要在 运行时进行动态绑定。 多态的概念 59 清华大学 郑莉JAVA语言程序设计 l观查下面例子,理解多态 l绘图直接的方式 希望能够画出任意子类型对象的形状 ,可以在Shape 类中声明几个绘图方法, 对不同的实际对象,采用不同的画法 5.3.1 多态的目的 一个例 子 多态的概念 60 aString =aShape.getClass().getName(); if(aString.equals(“Circle”) aShape.deawCircle(); if(aString.equals(“Triangle”) aShape.deawTriangle(); if(aString.equals(“Rectangle”) aShape.deawRectangle(); if (aShape instanceof Circle) aShape.drawCircle(); if (aShape instanceof Triangle) aShape.drawTriangle(); if (aShape instanceof Rectangle) aShape.drawRectangle(); 61 清华大学 郑莉JAVA语言程序设计 l绘图更好的方式 在每个子类中都声明同名的draw()方法 5.3.1 多态的目的 一个例 子 多态的概念 62 清华大学 郑莉JAVA语言程序设计 if (aShape instanceof Circle) aShape.draw (); if (aShape instanceof Triangle) aShape.draw(); if (aShape instanceof Rectangle) aShape.draw (); 63 清华大学 郑莉JAVA语言程序设计 可将上面代码进行如下简化: Shape s = new Circle(); s.draw(); lCircle属于Shape的一种,系统会执行自 动塑型 l当调用方法draw时,实际调用的是 Circle.draw() l如何区别不同派生类对同一方法的调用 ? 在程序运行时进行绑定 64 清华大学 郑莉JAVA语言程序设计 5.3.2 绑定的概念 l绑定 指将一个方法调用同一个方法主体连 接到一起。即,在主方法的循环体中确 定调用方法。 根据绑定时期的不同,可分为 l早期绑定 程序运行之前执行绑定 l晚期绑定 也叫作“动态绑定”或“运行期绑定 基于对象的类别,在程序运行时执 行绑定 多态的概念 65 清华大学 郑莉JAVA语言程序设计 l仍以绘图为例,所有类都放在binding包中 基类Shape建立了一个通用接口 class Shape void draw() void erase() 派生类覆盖了draw方法,为每种特殊的几 何形状都提供独一无二的行为 class Circle extends Shape void draw() System.out.println(“Circle.draw()“); void erase() System.out.println(“Circle.erase()“); 5.3.2 绑定的概念 例 5_8 多态的概念 66 清华大学 郑莉JAVA语言程序设计 class Square extends Shape void draw() System.out.println(“Square.draw()“); void erase() System.out.println(“Square.erase()“); class Triangle extends Shape void draw() System.out.println(“Triangle.draw()“); void erase() System.out.println(“Triangle.erase()“); 5.3.2 绑定的概念 例 5_8 多态的概念 67 清华大学 郑莉JAVA语言程序设计 l对动态绑定进行测试如下 public class BindingTester public static void main(String args) Shape s = new Shape9; int n; for(int i = 0; i 100) System.out.println(“Over budget!“); /不能重载 private String label = dest; public String readLabel() return label; ; public static void main(String args) Parcel9 p = new Parcel9(); Destination d = p.dest(“Tanzania“, 101.395F); 5.6 内部类 匿名的内部类 内部类 107 清华大学 郑莉JAVA语言程序设计 5.7 本章小结 l本章内容 接口作用及语法 塑型的概念及应用 多态的概念及引用 构造方法的调用顺序及其中的多态方法 内部内的有关知识 l本章要求 理解接口、塑型、多态的概念并能熟练应 用 熟练掌握构造方法的调用顺序,理解编写 时需要注意的问题 掌握内部类的语法结构及其应用场合 108 清华大学 郑莉JAVA语言程序设计 interface Computable int MAX=100; int f(int x); class comp1 implements Computable int number; public int f(int x) /不要忘记public关键字 int sum=0; for(int i=1;i=x;i+) sum=sum+i; return sum; class comp2 implements Computable int number; public int f(int x) return 44+x; 109 清华大学 郑莉JAVA语言程序设计 public class Example4_25 public static void main(String args) China zhang; comp1 zhang; comp2 wang; zhang=new comp1(); wang=new comp2(); zhang.number=991998+Computable.MAX; wang.number=941548+Computable.MAX; System.out.println(“number:“+zhang.number+ “求和“+zhang.f(100); System.out.println(“number:“+wang.number+ “求和“+wang.f(100); 返回 输出结果: Number:991998求和5050 Number:941548求和144 110 清华大学 郑莉JAVA语言程序设计 l对象可以被转型为其所属类实现的接口类型 getPolicyNumber、calculatePremium是 Insurable接口中声明的方法 getMileage是Car类新添加的方法,Insurable接口 中没有声明此方法 Car jetta = new Car(); Insurable item = (Insurable)jetta; /对象转型为 接口类型 item.getPolicyNumber(); item.calculatePremium(); item.getMileage(); / 接口中没有声明此方法 ,不可以 jetta.getMileage(); / 类中有此方法,可以 (Car)item).getMileage(); / 转型回原类,可调用 此方法了 5.1.2 实现接口 对象转型 接口 111 清华大学 郑莉JAVA语言程序设计 interface SpeakHello void speakHello(); class Chinese implements SpeakHello public void speakHello() System.out.println(“中国人习惯问候语:你好,吃饭了吗? “); class English implements SpeakHello public void speakHello() System.out.println(“英国人习惯问候语:你好,天气不错 “); 112 清华大学 郑莉JAVA语言程序设计 class KindHello public void lookHello(SpeakHello hello) hello.speakHello(); public class Example4_29 public static void main(String args) KindHello kindHello=new KindHello(); kindHello.lookHello(new Chinese(); kindHello.lookHello(new English(); 第二步: 将实现该接口的类的实例的 引用传递给该接口参数 第一步: 定义接口类型参数 SpeakHello hello; 第三步: 接口回调 返回 hello=newChinese() ; hello=new English(); 113 清华大学 郑莉JAVA语言程序设计 5.3 字符串与基本数据 的相互转化 l使用java.lang包中的Byte、Short、Integer 、 Long、Float、Double类调相应的类方法 : public static byte parseByte(String s) throws NumberFormatException public static short parseShort(String s) throws NumberFormatException public static short parseInt(String s) throws NumberFormatException public static long parseLong(String s) throws NumberFormatException public static float parseFloat(String s) throws NumberFormatException public static double parseDouble(String s) throws NumberFormatException 可以将“数字”格式的字符串,转化为相应的基 本数据类型。使用以上方法时,一定要在try catch中进行 114 清华大学 郑莉JAVA语言程序设计 l可以使用String类的的下列方法将数 值转化为字符串: public static String valueOf(byte n) public static String valueOf(int n) public static String valueOf(long n) public static String valueOf(float n) public static String valueOf(double n) 返回 115 interface Computerable public double 求面积(); class 梯形 implements Computerable double a,b,h; 梯形(double a,double b,double h) this.a=a; this.b=b; this.h=h; public double 求面积() return(1/2.0)*(a+b)*h); class 圆形 imp

温馨提示

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

最新文档

评论

0/150

提交评论