(1.7)--5- 抽象类和接口面向对象程序设计.ppt

上传人:奉*** 文档编号:96638160 上传时间:2024-02-01 格式:PPT 页数:52 大小:617KB
返回 下载 相关 举报
(1.7)--5- 抽象类和接口面向对象程序设计.ppt_第1页
第1页 / 共52页
(1.7)--5- 抽象类和接口面向对象程序设计.ppt_第2页
第2页 / 共52页
点击查看更多>>
资源描述

《(1.7)--5- 抽象类和接口面向对象程序设计.ppt》由会员分享,可在线阅读,更多相关《(1.7)--5- 抽象类和接口面向对象程序设计.ppt(52页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、Chapter5抽象类和接口抽象类和接口本章要点本章要点1.抽象抽象类和接口和接口;2.多多态;3.内部内部类。23学习目标学习目标了解什么是抽象了解什么是抽象类,什么是接口;,什么是接口;掌握抽象掌握抽象类和接口的定和接口的定义方法;方法;掌握接口和抽象掌握接口和抽象类的使用的使用场景;景;掌握多掌握多态的含的含义,多,多态的用法;的用法;掌握内部掌握内部类的定的定义方法和使用方法方法和使用方法5.15.1抽象类抽象类把客把客观世界中的相世界中的相类似的事物似的事物经过分析抽象就形分析抽象就形成了成了类,类实例化就例化就变成了成了对象。但是,并不是象。但是,并不是每一个每一个类都能准确的刻画

2、都能准确的刻画对象的行象的行为。例如。例如圆、长方形、三角形都是方形、三角形都是图形,都有求面形,都有求面积和周和周长的的方法,但是方法,但是图形形这个个类型不能准确的描述型不能准确的描述计算面算面积的方法,的方法,这个个时候就可以把候就可以把图形定形定义成抽象成抽象类。当一个当一个类没有足没有足够明确的信息来描述刻画明确的信息来描述刻画对象象时,这个个类就要定就要定义成抽象成抽象类。如果一个方法不能明确如何如果一个方法不能明确如何实现时,这个方法就个方法就要定要定义成抽象方法。成抽象方法。4抽象抽象类的定的定义格式如下:格式如下:修修饰符符 abstract class 类名名 /抽象抽象类

3、 /类体体 抽象方法的定抽象方法的定义格式如下:格式如下:修修饰符符 abstract 返回返回值类型型 方法名方法名(参数列表参数列表);55.1.1 5.1.1 抽象类的定义抽象类的定义6 关于抽象方法关于抽象方法说明如下:明如下:(1)抽象方法只有声明,没有)抽象方法只有声明,没有实现;(2)抽象)抽象类可以包含抽象方法,也可以不包含抽象方法。但可以包含抽象方法,也可以不包含抽象方法。但是包含抽象方法的是包含抽象方法的类必必须定定义成抽象成抽象类;(3)抽象)抽象类不能被不能被实例化,抽象例化,抽象类可以被可以被继承,所以不允承,所以不允许被定被定义成成final类;(4)继承抽象承抽象

4、类的的类必必须实现抽象抽象类的抽象方法,否的抽象方法,否则,也,也必必须定定义成抽象成抽象类;(5)一个)一个类实现某个接口,但没有某个接口,但没有实现该接口的所有方法,接口的所有方法,则必必须定定义成抽象成抽象类。7为什么要定义抽象类?为什么要定义抽象类?使用抽象使用抽象类的目的是的目的是:可以把子可以把子类共有部分抽出来,并且共有部分抽出来,并且实现所能所能实现的部分,从而的部分,从而为子子类提供提供继承,但不必承,但不必实现所有所有的方法,的方法,对于那些只需知道行于那些只需知道行为是什么,不用知是什么,不用知道具体怎么做的方法,可以只道具体怎么做的方法,可以只给出出说明,即定明,即定义

5、成抽象的,而把具体的成抽象的,而把具体的实现交交给子子类去做。去做。把那些共有的、但不能具体把那些共有的、但不能具体实现的行的行为抽出来,定抽出来,定义成抽象的方法,作用有两点成抽象的方法,作用有两点:一是一是为子子类规定了定了统一的一的规范,二是范,二是实现了了多多态性。性。【例【例5-15-1】定义一个抽象类】定义一个抽象类ShapeShape定定义一个抽象一个抽象类Shape,具有求面,具有求面积和周和周长的抽象方法,的抽象方法,然后定然后定义子子类Circle和和Rectangle,在子,在子类中中实现父父类中中定定义的抽象方法。的抽象方法。(1)定)定义抽象抽象类Shape,声明抽象

6、方法,声明抽象方法getArea()和和getPerimeter()。package ch5;public abstract class Shape public abstract double getArea();/求求图形面形面积的的抽象方法抽象方法public abstract double getPerimeter();/求求图形周形周长的抽象方法的抽象方法(未定(未定义构造方法,系构造方法,系统会自会自动添加一个无参数的构造方添加一个无参数的构造方法)法)8圆类圆类-Circle-Circlepublic class Circle extends Shape public class

7、 Circle extends Shape private double radius;/private double radius;/半径半径 public Circle(double radius)public Circle(double radius)this.radius=radius;this.radius=radius;public double getArea()public double getArea()return Math.PI*radius*radius;/return Math.PI*radius*radius;/计算面积计算面积 public double getP

8、erimeter()public double getPerimeter()return 2*Math.PI*radius;/return 2*Math.PI*radius;/计算周长计算周长长方形类长方形类-Rectangle-Rectanglepublic class Rectangle extends Shape public class Rectangle extends Shape private double x,y;/private double x,y;/长、宽长、宽 public Rectangle(double x,double y)public Rectangle(dou

9、ble x,double y)this.x=x;this.x=x;this.y=y;this.y=y;public double getArea()public double getArea()return x*y;/return x*y;/计算面积计算面积 public double getPerimeter()public double getPerimeter()return 2*(x+y);/return 2*(x+y);/计算周长计算周长 11 测试类测试类-TestShape1TestShape1public class TestShape1 public class TestSh

10、ape1 public static void main(String args)public static void main(String args)Circle c=new Circle(3);/Circle c=new Circle(3);/创建创建CircleCircle的对象的对象System.out.println(c.getArea()=+c.getAreSystem.out.println(c.getArea()=+c.getArea();a();Rectangle r=new Rectangle(5,4);/Rectangle r=new Rectangle(5,4);/创

11、建创建RectangleRectangle的对象的对象System.out.println(r.getPerimeter()=+r.gSystem.out.println(r.getPerimeter()=+r.getPerimeter();etPerimeter();125.1.2 5.1.2 向上转型向上转型【例【例5-15-1】中的测试类】中的测试类TestShape1.javaTestShape1.java中创建中创建了一个了一个CircleCircle对象对象c c和一个和一个RectangleRectangle对象对象r r,这,这种用法实际上并不好,实践中应该用种用法实际上并不好

12、,实践中应该用ShapeShape来声来声明对象变量,使用子类的构造方法来创建对象,明对象变量,使用子类的构造方法来创建对象,这要用到向上转型。向上转型是指把一个子类的这要用到向上转型。向上转型是指把一个子类的对象转成一个父类的对象。向上转型也是实现多对象转成一个父类的对象。向上转型也是实现多态的手段。态的手段。13public class TestShape2 public static void main(String args)Shape shape1=new Circle(3);/向上向上转型型 System.out.println(shape1.getArea()=+shape1.g

13、etArea();Shape shape2=new Rectangle(5,4);/向上向上转型型 System.out.println(shape2.getPerimeter()=+shape2.getPerimeter();Circle c1=(Circle)shape1;/向下向下转型型 System.out.println(c1.getArea()=+c1.getArea();【例【例【例【例5-25-25-25-2】利用向上转型编写】利用向上转型编写】利用向上转型编写】利用向上转型编写向上向上转型是指把一个子型是指把一个子类的的对象象转成一个父成一个父类的的对象。例如象。例如Shap

14、e shape1=new Circle(3);/向上向上转型型这行代行代码跟跟Shape shape1=(Shape)new Circle(3);效果是一效果是一样的,向上的,向上转型不需要型不需要强制制类型型转换。因。因为Circle的的对象本身就属于象本身就属于Shape类型,所以型,所以转换也是安全的。也是安全的。14向下向下转型是指把一个父型是指把一个父类对象象转到一个子到一个子类对象象Circle c1=(Circle)shape1;/向下向下转型型注意:注意:向下向下转型不一定安全,例如型不一定安全,例如shape2也是也是Shape类型的,如果型的,如果执行下列代行下列代码:Ci

15、rcle c2=(Circle)shape2;/向下向下转型型这会出会出现错误,因,因为shape2本身本身创建建时是一个是一个Rectangle类型的,型的,转成成Circle肯定要出肯定要出错。所。所以向下以向下转型是不安全的,不推荐使用,除非明确型是不安全的,不推荐使用,除非明确知道被知道被转换对象的象的实际类型是什么,能型是什么,能够确保确保转换正确才行。正确才行。15向上转型向上转型的作用的作用16【例【例5-3】编写一个写一个计算能算能够计算一算一组图形的面形的面积和的程序。和的程序。代代码见TestShape3.java代代码中中为了了计算一算一组圆的面的面积和一和一组长方方形的

16、面形的面积,分,分别编写了写了sumCircle、sumRectangle两个方法,如果再有其它两个方法,如果再有其它类的的图形,形,还得再加方法。得再加方法。能否能否编写通用一点的方法呢?写通用一点的方法呢?【例【例5-4】用向上】用向上转型重新修改上面的代型重新修改上面的代码代代码见TestShape4.java,其中包含方法:,其中包含方法:public double sumShape(Shape shapes)double sum=0;for(int i=0;ishapes.length;i+)sum=sum+shapesi.getArea();return sum;17mainmai

17、n方法的代码方法的代码public static void main(String args)Shape s=new Shape4;/s s0=new Circle(3);/半径半径为3的的Circle s1=new Circle(4);/半径半径为4的的Circle s2=new Rectangle(4,3);/Rectangle s3=new Rectangle(5,4);/Rectangle TestShape4 ts=new TestShape4();/sumShape是是实例方法,需要例方法,需要创建建对象象 System.out.println(sumShape=+ts.sumSh

18、ape(s);18sumShape(Shape shapes)方法的参数方法的参数是抽象是抽象类Shape类型的数型的数组shapes,所以,所以shapes里可以保存里可以保存Circle、Rectangle类型的型的对象,当然,如果再有其它象,当然,如果再有其它Shape类型的子型的子类对象,比如三角形也是可以的,象,比如三角形也是可以的,这样sumShape方法就可以方法就可以计算所有是算所有是Shape子子类的一的一组对象的面象的面积和,程序更和,程序更通用通用195.2 5.2 接口接口现实生活中,接口随生活中,接口随处可可见,比如,比如usb接接口、口、pci接口等,都是接口等,都

19、是对一些一些设备跟其他跟其他设备交互的交互的规范范标准。准。软件中也可以使用接件中也可以使用接口来定口来定义规范范标准。准。Java语言的接口是一些抽象方法的声明,言的接口是一些抽象方法的声明,是一些抽象方法的集合,是一些抽象方法的集合,这些方法都没有些方法都没有实现,需要在,需要在实现这些接口的些接口的类中来具体中来具体实现这些方法。不同的些方法。不同的类可以有不同的可以有不同的实现,从而,从而这些些实现可以具有不同的行可以具有不同的行为(功能)。(功能)。205.2.1 5.2.1 接口的定义接口的定义接口的定接口的定义格式格式为:public interface 接口名接口名 exten

20、ds 父父类接口名接口名列表列表 public static final type varable=value;/常常量列表量列表 public abstract type methodName(参数列参数列表表);/抽象方法列表抽象方法列表 21注意,接口的定注意,接口的定义跟外部跟外部类相似,只能定相似,只能定义成成public权限或者默限或者默认权限。接口里的限。接口里的变量量和方法都是公有的,即只能是和方法都是公有的,即只能是public权限,限,但但public可以省略。接口里的可以省略。接口里的变量必量必须是是static、final的,因而也可以称的,因而也可以称为静静态常量。常

21、量。22【例【例5-5】定】定义一个一个飞行器接口行器接口IPlane,具有,具有fly(飞行)方法。行)方法。public interface IPlane public abstract void fly(double speed);【例【例5-6】定】定义一个一个轮船接口船接口IShip,具有,具有sail(航(航行)方法。行)方法。public interface IShape public abstract void sail(doubl speed);23【例【例5-7】定】定义一个水上一个水上飞机接口机接口IAirBoat,继承承IPlane和和IShip接口。接口。public

22、 interface IAirBoat extends IPlane,IShipIairBoat既有既有飞机的功能,又有机的功能,又有轮船的功能。船的功能。注意:一个注意:一个类只能只能继承另外一个承另外一个类,但一个接口可,但一个接口可以同以同时继承多个接口,多个接口之承多个接口,多个接口之间用英文逗号分用英文逗号分隔开隔开245.2.2 5.2.2 接口的实现接口的实现Java中一个中一个类实现接口用接口用implements关关键字。格式如下:字。格式如下:类修修饰符符 class 类名名 extends 父父类名名 implements 接口名列表接口名列表 成成员变量定量定义;成成员

23、方法定方法定义;实现多个接口多个接口时,多个接口之,多个接口之间用用英文英文“,”分割开。分割开。25【例【例5-8】定】定义一个一个战斗机斗机类FighterPlane实现IPlane接口。接口。class FighterPlane implements IPlane【例【例5-9】定】定义一个中国水上一个中国水上飞机机类ChineseAirBoat实现IAirBoat接口。接口。public class ChineseAirBoat implements IAirBoat265.2.3 5.2.3 接口和抽象类的区别接口和抽象类的区别抽象抽象类与接口与接口紧密相关。然而接口又比抽象密相关。

24、然而接口又比抽象类更抽更抽象,象,这主要体主要体现在他在他们的差的差别上:上:(1)类能能实现多个接口,多个接口,只只能能继承一个承一个类,抽象,抽象类的子的子类仍可仍可实现接口。接口可以支持多接口。接口可以支持多继承;承;(2)抽象)抽象类中可以有普通方法,接口里的方法都中可以有普通方法,接口里的方法都是抽象方法,且都是是抽象方法,且都是public方法;方法;(3)抽象)抽象类中的成中的成员变量可以被不同的修量可以被不同的修饰符来符来修修饰,可以有,可以有实例例变量,也可以有量,也可以有类变量,接口中量,接口中的成的成员变量是量是public、static、final的的变量;量;(4)抽

25、象)抽象类中有构造方法,接口中不能有构造方中有构造方法,接口中不能有构造方法。法。27如何确定该选择如何确定该选择抽象类抽象类还是接口?还是接口?主要是看主要是看现实的的应用用场景。景。如果把如果把现实问题抽象出来后更符合抽象出来后更符合类的特征,的特征,具有具有实例例变量、非抽象的方法,那么只能是用量、非抽象的方法,那么只能是用抽象抽象类;如果如果实际问题只能抽象出需要只能抽象出需要规范的功能方法范的功能方法,而且,而且这些方法不知道如何些方法不知道如何实现,需要在子,需要在子类再再实现,不能抽象出,不能抽象出实例例变量,那么就量,那么就应该使使用接口。当然用接口。当然这时使用抽象使用抽象类

26、也可以,但是会也可以,但是会丧失灵活性,因失灵活性,因为其他其他类继承承该抽象抽象类后就不后就不能再能再继承承别的的类了。了。28【例【例5-10】定】定义一个接口一个接口IShape,具有求,具有求面面积和周和周长的抽象方法,新建的抽象方法,新建类MyCircle和和MyRectangle分分别实现IShape接口。接口。295.3 5.3 多态多态通俗的通俗的说,多,多态是指是指实现接口的多个接口的多个类或或一个父一个父类的多个子的多个子类虽然有相同的方法,然有相同的方法,但是具有不同的表但是具有不同的表现方式。方式。例如一个例如一个动物物类具有喊叫的方法,但是具有喊叫的方法,但是子子类猫

27、和子猫和子类狗的喊叫效果却不一狗的喊叫效果却不一样。30多态的两种实现形式多态的两种实现形式Java中多中多态有两种有两种实现形式。一种是通形式。一种是通过方法的重方法的重载,一种是通,一种是通过方法覆盖,即子方法覆盖,即子类通通过覆盖父覆盖父类的方法或的方法或类实现接口的方接口的方法。法。方法的重方法的重载是指一个是指一个类中定中定义了多个名字了多个名字相同、参数不同的方法。当相同、参数不同的方法。当实际调用用时,java编译器会根据参数的不同来自器会根据参数的不同来自动决定决定调用哪个方法。方法重用哪个方法。方法重载是在是在编译时就能就能决定决定调用哪个方法,因而也称用哪个方法,因而也称为

28、静静态多多态31动态多态动态多态利用子利用子类覆盖父覆盖父类的方法或者利用的方法或者利用实现接口的方接口的方法来法来实现的多的多态,是在程序运行期决定,是在程序运行期决定应该运行运行的哪个子的哪个子类对象的方法,因而称象的方法,因而称为动态多多态。例例5-1和例和例5-10分分别是通是通过覆盖父覆盖父类的方法、的方法、实现接口的方法来接口的方法来实现的多的多态。即用父。即用父类Shape或或接口接口IShape来声明来声明变量,然后用子量,然后用子类来来实例化例化对象,从而象,从而实现同一种同一种类型的型的变量、运行的量、运行的结果果不一不一样,有的,有的调用的是用的是圆形的面形的面积,有的,

29、有的调用的用的是是长方形的面方形的面积。325.4 5.4 内部类内部类如果把如果把类定定义在另一个在另一个类的里面,的里面,则这个个里面的里面的类就称就称为内部内部类。内部内部类的的优点是它属于外部点是它属于外部类的一个成的一个成员,与成与成员变量和成量和成员方法一方法一样,可以很方便,可以很方便的的访问外部外部类定定义的成的成员变量和成量和成员方法,方法,而且不用在外面而且不用在外面额外增加一个外增加一个类的定的定义。内部内部类有有4种形式:种形式:实例成例成员内部内部类、静、静态内部内部类、局部内部、局部内部类、匿名内部、匿名内部类。335.5.1 5.5.1 实例成员内部类实例成员内部

30、类实例成例成员内部内部类是定是定义在在类体内部、方法外面的体内部、方法外面的一个一个类,它与,它与实例例变量的地位一量的地位一样,属于外部,属于外部类的的对象所有,存在于象所有,存在于对象的内存空象的内存空间,只有,只有创建建了外部了外部类的的对象后,象后,该对象内存空象内存空间才有内部才有内部类的定的定义,才能使用,才能使用该内部内部类。【例【例5-12】定】定义外部外部类Outer,里面有一个内部,里面有一个内部类Inner,Inner中有中有print()方法,方法,print()方法的方法的目的是目的是输出外部出外部类的成的成员变量。量。Outer类也有一也有一个个print()方法,

31、它方法,它调用内部用内部类的的对象的象的print()方方法。法。代代码见Outer.java和和TestOuter.java345.5.2 5.5.2 静态内部类静态内部类把把一个内部一个内部类定定义成成static,则该内部内部类就称就称为静静态内部内部类。静。静态内部内部类存在于外部存在于外部类的内存空的内存空间,所以静,所以静态内部内部类不能不能访问外部外部类的的实例例变量量和和实例方法,只能例方法,只能访问外部外部类的的static的成的成员变量和成量和成员方法。同方法。同时,在,在测试类中使用静中使用静态内部内部类的的语法也不一法也不一样,不需要,不需要创建外部建外部类的的对象。象

32、。【例【例5-13】静】静态内部内部类。将【例。将【例5-12】中的内部】中的内部类改成静改成静态内部内部类代代码见OuterStatic.java、TestOuterStatic.java355.5.3 5.5.3 局部内部类局部内部类定定义在方法体内的在方法体内的类称称为局部内部局部内部类,它的作用,它的作用域只是所在的方法内。域只是所在的方法内。这种内部种内部类用的不多,不再用的不多,不再详细介介绍。365.5.4 5.5.4 匿名内部类匿名内部类匿名内部匿名内部类就是没有名字的内部就是没有名字的内部类,一般用在,一般用在图形形界面中,用于做事件界面中,用于做事件监听器。听器。创建匿名内

33、部建匿名内部类必必须事先有一个接口或者父事先有一个接口或者父类,把,把内部匿名内部匿名类定定义为接口的一个接口的一个实现类或者是某个父或者是某个父类的子的子类。37内部匿名类的定义和对象创建内部匿名类的定义和对象创建实际上是把上是把创建建对象和定象和定义匿名内部匿名内部类的的类体同体同时进行的。格式如下:行的。格式如下:new 父父类构造构造方法方法(参数列表)(参数列表)/匿名内部匿名内部类的的类体部分体部分 或者或者new 接口()接口()/匿名内部匿名内部类的的类体部分体部分 38【例【例5-15】内部匿名】内部匿名类的用法。定的用法。定义一个一个抽象抽象类Fish,具有抽象方法,具有抽

34、象方法swim。在。在TestFish测试类中定中定义了一个了一个print方法,方法,print方法的参数是一个方法的参数是一个Fish类型的型的对象象fish,目的是打印出,目的是打印出fish的的swim方法的返方法的返回回值,即游,即游过的距离。在的距离。在TestFish的的main方法中,使用内部匿名方法中,使用内部匿名类创建了建了Fish的的对象,并象,并输出了出了该对象象swim方法的返回方法的返回值。代代码见Fish.java和和TestFish.java39packagech5;packagech5;publicabstractclassFishpublicabstract

35、classFishprivateStringname;privateStringname;publicStringgetName()returnname;publicStringgetName()returnname;publicvoidsetName(Stringname)publicvoidsetName(Stringname)this.name=name;this.name=name;publicFish(Stringname)this.name=name;publicFish(Stringname)this.name=name;publicabstractdoubleswim();/p

36、ublicabstractdoubleswim();/返回游返回游过的距离的距离 publicclassTestFishpublicclassTestFishpublicvoidprint(Fishfish)publicvoidprint(Fishfish)System.out.println(fish.getName()+System.out.println(fish.getName()+已已经游了游了+fish.swim()+fish.swim()+米米););publicstaticvoidmain(Stringargs)publicstaticvoidmain(Stringargs)T

37、estFishtestFish=newTestFish();TestFishtestFish=newTestFish();testFish.print(newFish(testFish.print(newFish(鲸鱼)/)/匿名匿名类的的类体体,相当相当于下面定于下面定义的的MyFishMyFish类publicdoubleswim()publicdoubleswim()returnreturn5000;););testFish.print(testFish.print(newFish(newFish(鲸鱼)publicdoubleswim(doubletime)publicdoublesw

38、im(doubletime)returnreturn5000;););相当于相当于testFish.printtestFish.print(new MyFish(鲸鱼););class MyFish extends Fish publicdoubleswim(doubletime)publicdoubleswim(doubletime)returnreturn5000;packagech5;packagech5;publicabstractclassFishpublicabstractclassFishprivateStringname;privateStringname;publicStri

39、nggetName()returnname;publicStringgetName()returnname;publicvoidsetName(Stringname)publicvoidsetName(Stringname)this.name=name;this.name=name;publicFish(Stringname)this.name=name;publicFish(Stringname)this.name=name;publicabstractdoubleswim(doubletime);/publicabstractdoubleswim(doubletime);/返返回回time

40、小小时游游过的距离的距离 publicclassTestFishpublicclassTestFishpublicvoidprint(Fishfish)publicvoidprint(Fishfish)System.out.println(fish.getName()+System.out.println(fish.getName()+已已经游了游了+fish.swim(3)+fish.swim(3)+米米););publicstaticvoidmain(Stringargs)publicstaticvoidmain(Stringargs)TestFishtestFish=newTestFis

41、h();TestFishtestFish=newTestFish();testFish.print(newFish(testFish.print(newFish(鲸鱼)/)/匿名匿名类的的类体体,相当相当于下面定于下面定义的的MyFishMyFish类doublespeed=5.5;/doublespeed=5.5;/鲸鱼每小每小时游游5.55.5公里公里publicdoubleswim(doubletime)publicdoubleswim(doubletime)return5.5*time;return5.5*time;););5.4 5.4 面向接口编程面向接口编程面向接口面向接口编程就

42、是先把客程就是先把客户的的业务逻辑功能提取功能提取出来,作出来,作为接口,接口,业务具体具体实现通通过该接口的接口的实现类来完成。将具体来完成。将具体逻辑与与实现分开,减少了各分开,减少了各个个类之之间的相互依的相互依赖。当各个当各个类变化化时,不需要,不需要对已已经编写的系写的系统进行改行改动,添加新的,添加新的实现类就就可以了,不用担心新改可以了,不用担心新改动的的类对系系统的其他模的其他模块造成影响。其遵循的思想是:造成影响。其遵循的思想是:对扩展开放,展开放,对修修改关改关闭。当客当客户需求需求变化化时,只需,只需编写写该业务逻辑的新的的新的实现类,就可以完成需求,不需要改写,就可以完

43、成需求,不需要改写现有代有代码,减少减少对系系统的影响。的影响。46例如在例如在编写写图形的形的计算面算面积、周、周长的功能的功能时,只,只要要编写一个写一个IShape接口,里面定接口,里面定义求面求面积和周和周长的抽象方法。具体要的抽象方法。具体要计算算圆形、形、长方形的面方形的面积和周和周长,只要分,只要分别编写一个写一个圆形形类、长方形方形类来来实现IShape接口即可。将来再要接口即可。将来再要计算三角形、算三角形、五五边形等的面形等的面积和周和周长时,现有的代有的代码不需要改不需要改动,只要再增加一个三角形,只要再增加一个三角形类、五、五边形形类,并,并让它它们实现IShape接口

44、即可。接口即可。前面的【例前面的【例5-10】就是一个面向接口】就是一个面向接口编程的好例程的好例子。子。475.6 5.6 案例实训:模拟读写数据案例实训:模拟读写数据面向接口面向接口编程能程能够让设计和和实现分开。分开。设计阶段段只要只要设计好接口,具体好接口,具体详细功能由功能由编码人人员编写写具体的具体的实现类来完成。来完成。编写一个模写一个模拟读写数据的程序。写数据的程序。现在有在有BusinessA、BusinessB、BusinessC三个三个业务类都要用到都要用到读写数据的功能。数据可能保存到写数据的功能。数据可能保存到数据数据库、文本文件、文本文件、excel文件中。文件中。

45、48实现步骤实现步骤(1)设计读写数据的接口写数据的接口IReadSaveData(2)设计业务类BusinessA、BusinessB、BusinessC(3)针对每种数据来源每种数据来源编写相写相应的的读写数写数据的据的实现类(4)编写写测试类495.6 5.6 本章小结本章小结本章介本章介绍了抽象了抽象类、接口、多、接口、多态、匿名、匿名类。抽象抽象类使用使用abstract来声明,接口使用来声明,接口使用interface来声明。来声明。抽象抽象类和接口都能和接口都能对子子类的通用方法的通用方法进行行规范,范,抽象抽象类可以可以让子子类继承一部分属性和功能,承一部分属性和功能,实现代代

46、码重用。重用。接口主要是公用方法的接口主要是公用方法的规范定范定义,让所有所有实现接接口的口的类都有都有统一的功能方法,同一的功能方法,同时接口接口还可以可以实现多重多重继承。承。50多多态是面向是面向对象程序象程序设计的一个重要特征。多的一个重要特征。多态有有2种种实现方式,一种是通方式,一种是通过方法重方法重载的方式,的方式,一种是通一种是通过方法覆盖的方式。方法覆盖的方式。实践中主要使用方法覆盖的方式来践中主要使用方法覆盖的方式来实现动态多多态。方法覆盖是通方法覆盖是通过子子类覆盖父覆盖父类的方法,或者的方法,或者类实现接口中的方法,在声明接口中的方法,在声明对象象变量量时使用父使用父类

47、或或接口来声明接口来声明变量,量,创建建对象象则使用子使用子类来来创建。建。内部内部类是定是定义在一个在一个类体内部的体内部的类。内部。内部类有有4种形式:种形式:实例成例成员内部内部类、静、静态内部内部类、局部内、局部内部部类、匿名内部、匿名内部类。51容易出错的地方容易出错的地方本章中容易出本章中容易出错的地方有以下几点:的地方有以下几点:(1)抽象)抽象类不能定不能定义成成final的,因的,因为final类不能不能有子有子类,而抽象,而抽象类必必须通通过子子类来来实现其中定其中定义的的抽象方法;抽象方法;(2)一个)一个类可以在可以在继承某个承某个类的同的同时,还可以可以实现多个接口;多个接口;(3)接口中的)接口中的变量都是量都是public、static、final的,的,但是可以省略但是可以省略这三个关三个关键字字;(4)接口中的方法都是)接口中的方法都是public、abstract的的。52

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 大学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁