接口与多态.ppt

上传人:本田雅阁 文档编号:2483890 上传时间:2019-04-02 格式:PPT 页数:47 大小:901.01KB
返回 下载 相关 举报
接口与多态.ppt_第1页
第1页 / 共47页
接口与多态.ppt_第2页
第2页 / 共47页
接口与多态.ppt_第3页
第3页 / 共47页
亲,该文档总共47页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《接口与多态.ppt》由会员分享,可在线阅读,更多相关《接口与多态.ppt(47页珍藏版)》请在三一文库上搜索。

1、接口与多态,接口 多态 构造方法与多态,接口,为什么要使用接口? 在软件工程领域,要求不同的软件之间能够交互。这就需要不同软件的开发人员有一个共有的“契约”,这样以来,他们在编写各自的代码时,不用知道对方的代码是怎样实现的。 概括来讲,接口(interface)就是这样一种“契约”。,接口,为什么要使用接口? 设想在未来,汽车有一个无人驾驶系统, 由汽车制造商使用Java语言来开发,用来控制汽车的启动,停止,转向和加速等。其它的企业, 如电子导航设备的执照商, 开发计算机系统接收 GPS 地理位置数据和交通状况的信息并利用这些信息来驾驶汽车。 汽车制造商必须要发布作为产业标准的公用的接口,并规

2、定接口中的方法,用来操纵汽车。 那么导航设备的制造商能够编写软件调用这些控制汽车方法。汽车制造商和导航设备制造商都不需要知道对方的软件是怎样实现的。他们只需要知道可以调用对方软件接口中提供的方法就可以了。,接口,例1:根据上面的故事,我们创建一个接口OperateCar,提供对汽车的各种操作。 public interface OperateCar int turn(Direction direction, double radius, double startSpeed, double endSpeed); int changeLanes(Direction direction, doubl

3、e startSpeed, double endSpeed);,接口,int signalTurn(Direction direction, boolean signalOn); int getRadarFront(double distanceToCar, double speedOfCar); int getRadarRear(double distanceToCar, double speedOfCar); / more method signatures ,接口,读完上面的代码大家发现了什么特点? 接口中的方法没有大括号和表示语句终止的分号。 下面我们编写一个实现了该接口的类。在这个类

4、中必须实现接口中声明的每个方法。,接口,public class OperateBMW760i implements OperateCar int signalTurn(Direction direction, boolean signalOn) /编写代码实现BMW右转后关闭右转向灯 /编写代码实现BMW左转后关闭左转向灯 /编写代码实现BMW右转前打开右转向灯 /编写代码实现BMW左转前打开左转向灯 /其他成员方法 ,接口,本案例小结 上面提供了一个由机器人驾驶汽车的例子,实现这个接口的任务将由具体的汽车制造商来完成。 Chevrolet的实现方式肯定不同于Toyota, 当然, 这两个制

5、造商都使用的是同样的接口。 而对于车载导航系统的制造商, 他们要实现的是这些接口的客户机程序,构建在汽车上可以使用GPS 数据(街道的电子地图、指引汽车行驶所需的交通数据 )的软件系统。 要实现这一点, 导航系统需要能够调用这个接口的方法:turn, change lanes, brake, accelerate, and so forth。,接口,怎样定义一个接口 一个接口的定义包含以下部分: public interface GroupedInterface extends Interface1 double E = 2.718282; void doSomething (int i, d

6、ouble x); int doSomethingElse(String s); ,访问控制符,接口关键字,接口名,接口可以继承,接口中可以定义常量,接口中只声明,不实现方法,接口,例2:假设在一个CAD软件中,要实现同类型图形对象大小的比较,用来比较对象的大小。比如定义一个矩形类实现该接口,使矩形类产生的对象可以调用特定方法来比较它们的大小。,接口,如果你想比较这个CAD系统中任何同类型的对象(正圆、椭圆、矩形、三角形)的大小,这些具体的类都应该实现这个Relatable接口。 不同的类,比较大小的原则是不同的,比如:平面图形类比较的是它们的面积,三维图形类比较的是它们的体积,字符串比较的是

7、字符的个数 由此可见,不同类中对接口规定的比较大小的方法是不同的,不同的类对相同的方法有不同的诠释。 下面给出代码范例。,接口,定义接口 public interface Relatable int isLargerThan(Relatable other); ,实现该接口的类要给出该方法的具体实现,这个类的对象在调用时,返回-1,0,1,分别表示这个这个对象是小于、等于还是大于由参数传入的对象,接口,定义接口案例 public class RectanglePlus implements Relatable public int width = 0; public int height =

8、0; public Point origin; / 定义四个构造方法 public RectanglePlus() origin = new Point(0, 0); public RectanglePlus(Point p) origin = p; public RectanglePlus(int w, int h) origin = new Point(0, 0); width = w; height = h; public RectanglePlus(Point p, int w, int h) origin = p; width = w; height = h; ,接口,/ 移动矩形的

9、方法 public void move(int x, int y) origin.x = x; origin.y = y; / 计算该矩形的面积 public int getArea() return width * height; ,接口,/ 实现Relatable的方法 public int isLargerThan(Relatable other) RectanglePlus otherRect = (RectanglePlus)other; if (this.getArea() otherRect.getArea() return 1; else return 0; 因为 Rectan

10、glePlus 实现了 Relatable, 任何两个 RectanglePlus 的对象都可以比较大小了。,接口,定义一个Comparator的类,它定义了一个比较一对对象大小的方法,而Comparator不必实现Relatable接口。 public Object findLargest(Object object1, Object object2) Relatable obj1 = (Relatable)object1; Relatable obj2 = (Relatable)object2; if ( (obj1).isLargerThan(obj2) 0) return object

11、1; else return object2; ,接口,这样实现方法的目的是要比较的两个对象可以不考虑是否是由同一个类创建的,如果创建这两个对象的类之间有继承关系,它们也可以比较。,接口,思考与练习 根据上面的案例,请你自己实现下面两个方法: public Object findSmallest(Object object1, Object object2) 用来获取一对对象中较小的那个对象; public boolean isEqual(Object object1, Object object2) 判断一对对象是否相等;,接口,假设你已经定义了一个接口DoIt: public interf

12、ace DoIt void doSomething(int i, double x); int doSomethingElse(String s); 如果你现在要想加入第三个方法到DoIt,使接口变成: public interface DoIt void doSomething(int i, double x); int doSomethingElse(String s); boolean didItWork(int i, double x, String s); ,接口,如果你这样做了,那你就有麻烦了!你必须修改以前实现该接口的所有的类,因为这些类没有实现新加入的第三个方法。 如果我们既想

13、要添加这个方法,又不原意去惊动以前的类,怎么办呢? public interface DoItPlus extends DoIt boolean didItWork(int i, double x, String s); 当你要在接口中用第三个方法时,就使用这个新的接口吧。,接口,接口小结 一个接口定义两个相互通信的对象的协议。接口中包括一组只有声明没有实现的方法,也可以包含一组常量,它们都默认为static和final。 一个类如果要实现一个接口,在类体中就必须实现接口中声明的所有方法。 接口可以被当作一个数据类型来使用。 接口之间可以继承。,接口,思考与练习 编写一个类实现 java.la

14、ng 包中的CharSequence 接口。用一个字符串作为测试的数据。 假设你已经完成了一个有计时功能的服务器程序,它可以定时通知客户机当前的日期和时间。 编写一个服务器程序可以使用的接口,用来向客户机添加特定协议。,多态,类的继承机制不仅仅提供了对类的重用,而且为应用程序提供了极大的灵活性,这种灵活性我们通常叫做多态。那么,什么是多态?我们在编程中如何体现这种灵活性呢? 在面向对象的编程中,“多态”意味着调用一个方法时,因为对方法传入参数的对象类型不同,语言可以自动执行能够对应该对象类型的特定方法(方法的具体实现可能有多种)。,多态,bark(),bark(),bark(),aDog.ba

15、rk(),多态,上图中三个子类的bark()方法实现内容都不一样,在程序中到底用那一个,取决于对象的类型是上面的那个类。 多态性提供统一的调用接口,程序会自动根据不同的需求(参数),执行不同函数(方法)。 为了更好地说明多态性的实现过程,我们列举下面的程序来说明。,多态,解决方案 public class Animal public Animal(String aType) type = new String(aType); public String toString() return “This is a “ + type; / Dummy method to be implemented

16、 in the derived classes public void sound() private String type; ,多态,解决方案 public class Cat extends Animal public Cat(String aName) super(“Cat“); / Call the base constructor name = aName; / Supplied name breed = “Unknown“; / Default breed value public Cat(String aName, String aBreed) super(“Cat“); /

17、Call the base constructor name = aName; / Supplied name breed = aBreed; / Supplied breed ,多态,解决方案 public class Cat extends Animal / Return a String full of a cats details public String toString() return super.toString() + “nIts “ + name + “ the “ + breed; / A miaowing method public void sound() Syst

18、em.out.println(“Miiaooww“); private String name; / Name of a cat private String breed; / Cat breed ,多态,解决方案 public class Dog extends Animal public Dog(String aName) super(“Dog“); / Call the base constructor name = aName; / Supplied name breed = “Unknown“; / Default breed value public Dog(String aNam

19、e, String aBreed) super(“Dog“); / Call the base constructor name = aName; / Supplied name breed = aBreed; / Supplied breed ,多态,解决方案 / Present a dogs details as a string public String toString() return super.toString() + “nIts “ + name + “ the “ + breed; / A barking method public void sound() System.

20、out.println(“Woof Woof“); private String name; / Name of a Dog private String breed; / Dog breed ,多态,解决方案 public class Duck extends Animal public Duck(String aName) super(“Duck“); / Call the base constructor name = aName; / Supplied name breed = “Unknown“; / Default breed value public Duck(String aN

21、ame, String aBreed) super(“Duck“); / Call the base constructor name = aName; / Supplied name breed = aBreed; / Supplied breed ,多态,解决方案 / Return a String full of a ducks details public String toString() return super.toString() + “nIts “ + name + “ the “ + breed; / A quacking method public void sound(

22、) System.out.println(“Quack quackquack“); private String name; / Duck name private String breed; / Duck breed ,多态,import java.util.Random; public class TryPolymorphism public static void main(String args) / Create an array of three different animals Animal theAnimals = new Dog(“Rover“, “Poodle“), ne

23、w Cat(“Max“, “Abyssinian“), new Duck(“Daffy“,“Aylesbury“) ; Animal petChoice; / Choice of pet / Random number generator Random select = new Random();,多态,public static void main(String args) / Make five random choices of pet for(int i = 0; i 5; i+) / Choose a random animal as a pet petChoice = theAni

24、malsselect. nextInt(theAnimals.length); System.out.println(“nYour choice:n“ + petChoice); petChoice.sound(); / Get the pets reaction ,构造方法与多态,问题描述: 构造方法与其它方法区别之一就是构造方法并不具有多态性,那么构造方法如何在复杂的分级结构中同多态性一起使用呢?,构造方法与多态,要点讲解: 基类的构造方法肯定会在派生类的构造方法中被调用。 一个派生类只能访问它自己的成员,不能访问具有private属性的基类成员。 只有基类的构造方法在初始化自己的元素时,

25、才知道整个对象的可以使用的方法和拥有的适当权限。 所以,在使用一个类创建一个对象时,必须使该类所有父类的构造方法都得到调用,否则整个对象的构建就可能不正确。,构造方法与多态,案例分析: 下面的代码,给出了从派生类到基类,构造方法的调用过程。 class Point private double x; private double y; public Point() public Point(double x, double y) this.x = x; this.y = y; ,构造方法与多态,案例分析: public String toString() return “(“ + Double

26、.toString(x) + “, “ + Double.toString(y) + “)“; ,构造方法与多态,案例分析: class Ball private Point center; /中心点 private double radius; /半径 private String colour; /颜色 public Ball() / 具有中心点及半径的构造方法 public Ball(double xValue, double yValue, double r) /调用类Point中的构造方法 center = new Point(xValue, yValue); radius = r;

27、 ,构造方法与多态,案例分析: / 具有中心点、半径及颜色的构造方法 public Ball(double xValue, double yValue, double r, String c) this(xValue, yValue, r); / 调用三个参数的构造方法 colour = c; public String toString() return “A ball with center “ + center.toString() + “radius “ + Double.toString(radius) + “, colour “ + colour; ,构造方法与多态,案例分析: c

28、lass MovingBall extends Ball private double speed; public MovingBall() public MovingBall(double xValue, double yValue, double r, String c, double s) super(xValue, yValue, r, c); / 调用父类Ball中具有四个参数的构造方法 speed = s; public String toString() return super.toString() + “, speed “ + Double.toString(speed);

29、/ 类MovingBall结束,构造方法与多态,案例分析: / 具有中心点、半径及颜色的构造方法 public Ball(double xValue, double yValue, double r, String c) this(xValue, yValue, r); / 调用三个参数的构造方法 colour = c; public String toString() return “A ball with center “ + center.toString() + “, radius “ + Double.toString(radius) + “, colour “ + colour;

30、,构造方法与多态,案例分析: public class Tester public static void main(String args) MovingBall mb = new MovingBall(10, 20, 40, “green“, 25); System.out.println(mb); ,构造方法与多态,思考与练习: 根据派生类,推断并写出它们的接口Graph: Class Circle implements Graph double r; public void draw() System.out.println(“Circle.draw()”); public void

31、setR(double r) this.r = r; ,构造方法与多态,思考与练习: 根据派生类,推断并写出它们的接口Graph: class Square implements Graph public void draw() System.out.println(“Square.draw()”); ,小结,本章介绍了Java语言的接口,以及多态机制。接口是面向对象的一个重要机制。 使用接口可以实现多继承的效果。 接口中的所有方法都是抽象的,这些抽象方法由实现按这一接口的不同类来具体完成。 使用接口可以在看起来不相关的之间定义共同的行为。 利用多态可以将一个对象当作它的基类对象使用,对不同类型进行相同的处理。而且这些不同派生类的对象响应同一方法时的行为是由差别的。,Copyright 2008 版权所有 东软集团,

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

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1