面向对象程序设计高级.ppt

上传人:s9****2 文档编号:570257852 上传时间:2024-08-03 格式:PPT 页数:44 大小:821.06KB
返回 下载 相关 举报
面向对象程序设计高级.ppt_第1页
第1页 / 共44页
面向对象程序设计高级.ppt_第2页
第2页 / 共44页
面向对象程序设计高级.ppt_第3页
第3页 / 共44页
面向对象程序设计高级.ppt_第4页
第4页 / 共44页
面向对象程序设计高级.ppt_第5页
第5页 / 共44页
点击查看更多>>
资源描述

《面向对象程序设计高级.ppt》由会员分享,可在线阅读,更多相关《面向对象程序设计高级.ppt(44页珍藏版)》请在金锄头文库上搜索。

1、第第3章章 面向对象程序设计高级面向对象程序设计高级郭建宏郭建宏椅子大戰椅子大戰n從前,有一間軟件小鋪,裡面有兩個程序從前,有一間軟件小鋪,裡面有兩個程序員被指派去設計一個程序。員被指派去設計一個程序。n壞心的老闆娘兼項目經理要求兩個人比賽,壞心的老闆娘兼項目經理要求兩個人比賽,贏的人可以坐上象徵身份地位的贏的人可以坐上象徵身份地位的AeronTM寶椅。寶椅。n程序開發高手程序開發高手阿珠阿珠和面向對象的信徒和面向對象的信徒阿花阿花兩個人都相信自己贏的可能性很大。兩個人都相信自己贏的可能性很大。需求需求n在图形接口中画出四方形(在图形接口中画出四方形(squre),圆形),圆形(circle)

2、和三角形()和三角形(triangle),图形),图形需要顺时针绕中心旋转,同时输出需要顺时针绕中心旋转,同时输出AIF音音效文件。效文件。阿珠是怎樣做的?阿珠是怎樣做的?n和以往一样,阿珠准备好开始设计重要的程序。和以往一样,阿珠准备好开始设计重要的程序。没几下就写出了没几下就写出了rotate和和playSound方法。方法。nrotate() n / 绕中心旋转绕中心旋转360度。度。nnplaySound() n / 播放播放aif文件。文件。n阿花是怎樣做的?阿花是怎樣做的?n阿花分别为三个形状各写出一个类。阿花分别为三个形状各写出一个类。新的需求(一)新的需求(一)n前面的形状需要

3、加上阿米巴原虫(前面的形状需要加上阿米巴原虫(Amoeba)形状。)形状。n用户点选时也是旋转并播放用户点选时也是旋转并播放.hif的声音文件。的声音文件。阿珠该怎样做?阿珠该怎样做?n原来的原来的rotate程序还可以用。程序还可以用。n但是但是playSound就得要修改。就得要修改。n虽然修改的幅度不大,但是阿珠实在不想去碰已虽然修改的幅度不大,但是阿珠实在不想去碰已经测试过的程序代码。他应该很清楚,不管项目经测试过的程序代码。他应该很清楚,不管项目经理怎么保证,需求就是会不停的改。经理怎么保证,需求就是会不停的改。nplaySound(shapeNum) / 参数用来标参数用来标识传入

4、的是否是识传入的是否是amoeba图形图形n / 如果不是阿米巴形状,则播放如果不是阿米巴形状,则播放.aif文件。文件。n / 如果是则播放如果是则播放.hif文件文件n阿花該怎樣做?阿花該怎樣做?n阿花则写出一个新的类。阿花则写出一个新的类。n面向对象让他最喜欢的其中一点就是有时不需改面向对象让他最喜欢的其中一点就是有时不需改动已经测试好的程序就可以达成新的目标。动已经测试好的程序就可以达成新的目标。n面向对象的适应性和可扩展性让他面对修改时不面向对象的适应性和可扩展性让他面对修改时不会觉得太痛苦。会觉得太痛苦。新的需求(二)新的需求(二)n阿米巴虫在旋转的时候需要以给定的作为阿米巴虫在旋

5、转的时候需要以给定的作为原点旋转。原点旋转。阿珠該怎樣做?阿珠該怎樣做?n阿珠最好还是帮阿珠最好还是帮rotate程序加上轴心点的程序加上轴心点的参数。这样就有一堆程序要改。参数。这样就有一堆程序要改。n本来已经测试好的东西全部又得重来一遍。本来已经测试好的东西全部又得重来一遍。nrotate(shapeNum, xPt, yPt)n / 如果不是阿米巴,则绕中心旋转。如果不是阿米巴,则绕中心旋转。n / 否则以否则以xPt和和yPt作为旋转中心旋转。作为旋转中心旋转。n阿花该怎样做阿花该怎样做n阿花修改阿花修改rotate这个方这个方法,但不是每个都要修法,但不是每个都要修改,只修改改,只修

6、改Amoeba这这个类而已。个类而已。n其他已经测试、编译过其他已经测试、编译过的部分完全没有必要修的部分完全没有必要修改。改。n该类需要的修改就是加该类需要的修改就是加上旋转轴心点的属性。上旋转轴心点的属性。问题的解决问题的解决n从上面的分析可以看出,阿花的设计是非从上面的分析可以看出,阿花的设计是非常好的。常好的。n但是还有一个问题,在每个类中但是还有一个问题,在每个类中rotate和和playSound有很多都是重复的。这样做太有很多都是重复的。这样做太没有效率了。该怎样解决这样的问题呢?没有效率了。该怎样解决这样的问题呢?n答案就是应用答案就是应用“继承继承”来解决。来解决。怎樣繼承怎

7、樣繼承继承概述继承概述n多个类中存在相同属性和行为时,将这些内容抽取到单多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,独一个类中,那么多个类无需再定义这些属性和行为,只要继承单独的那个类即可。只要继承单独的那个类即可。n多个类可以称为子类,单独这个类称为父类或者超类。多个类可以称为子类,单独这个类称为父类或者超类。n通过通过extends关键字让类与类之间产生继承关系。关键字让类与类之间产生继承关系。nclass SubDemo extends Demon子类继承父类后,都继承了父类的那些哪些成员呢?子类继承父类后,都继承了父类的那些哪些成员呢

8、?n子类继承了父类的属性,包括私有属性。子类继承了父类的属性,包括私有属性。n子类继承了除构造方法外的其他所有方法。子类继承了除构造方法外的其他所有方法。n问题:问题:n为什么子類對象在實例化之前必須首先調用父類中的構造方法之为什么子類對象在實例化之前必須首先調用父類中的構造方法之後再調用子類自己的構造方法?後再調用子類自己的構造方法?继承的特点继承的特点nJava只支持单继承,不支持多继承只支持单继承,不支持多继承。n一个类只能有一个父类,不可以有多个父类一个类只能有一个父类,不可以有多个父类。nclass SubDemo extends Demo /oknclass SubDemo ext

9、ends Demo1,Demo2./errorn Java支持多层继承(继承体系)支持多层继承(继承体系)nclass Anclass B extends Anclass C extends Bn子类对象实例化子类对象实例化n子類對象在實例化之前必須首先調用父類中的構造方法之後再調子類對象在實例化之前必須首先調用父類中的構造方法之後再調用子類自己的構造方法。用子類自己的構造方法。n定义继承需要注意定义继承需要注意n不要仅为了获取其他类中的某个功能而去继承。不要仅为了获取其他类中的某个功能而去继承。n类与类之间要有所属类与类之间要有所属(“is a”)的关系,的关系,xx1是是xx2的一种。的一

10、种。阿米巴的阿米巴的rotate该怎么办?该怎么办?n阿米巴形状会需要完全不同的阿米巴形状会需要完全不同的rotate和和playSound程序,如果都继承程序,如果都继承Shape,那,那旋转的功能就都一样了。旋转的功能就都一样了。n解决方法:解决方法:Amoeba这个类可以覆盖这个类可以覆盖(override)Shape的方法。(多态)的方法。(多态)阿米巴的阿米巴的rotate该怎么办?该怎么办?方法覆写(方法覆写(Override)n子类中出现与父类一模一样的方法时,会出现覆盖操作,子类中出现与父类一模一样的方法时,会出现覆盖操作,也称为重写或者复写。也称为重写或者复写。n父类中的私有

11、方法不可以被覆盖。父类中的私有方法不可以被覆盖。n在子类覆盖方法中,继续使用被覆盖的方法可以通过在子类覆盖方法中,继续使用被覆盖的方法可以通过“super.函数名函数名”获取(获取(super关键字部分介绍)。关键字部分介绍)。n覆盖注意事项覆盖注意事项n覆盖时,子类方法权限一定要大于父类方法权限。覆盖时,子类方法权限一定要大于父类方法权限。nprivateprotecteddefaultpublicn静态只能覆盖静态。静态只能覆盖静态。n覆盖的应用覆盖的应用n当子类需要父类的功能,而功能主体子类有自己特有内容时,可当子类需要父类的功能,而功能主体子类有自己特有内容时,可以复写父类中的方法,这

12、样,即沿袭了父类的功能,又定义了子以复写父类中的方法,这样,即沿袭了父类的功能,又定义了子类特有的内容。类特有的内容。重载和覆写的区别重载和覆写的区别No.区区别点点重重载覆写覆写1定定义方法名称相同,参方法名称相同,参数数类型、个数或型、个数或顺序不同。序不同。方法名称、参数或个数、方法名称、参数或个数、返回返回值类型相同。型相同。2权限权限没有没有权限要求限要求被覆写的方法不能被覆写的方法不能拥有比有比父父类更更严格的格的权限。限。3范围范围发生在同一个生在同一个类中中发生在生在继承关系中承关系中4单词OverLoadingOverride继承的意义继承的意义n继承的出现提供了代码的复用性

13、。继承的出现提供了代码的复用性。n继承的出现让类与类之间产生了关系,提继承的出现让类与类之间产生了关系,提供了多态的前提。供了多态的前提。n子类继承父类可以扩展已有类的功能。子类继承父类可以扩展已有类的功能。n在工程中,父类一般都提供一个接口。(此问在工程中,父类一般都提供一个接口。(此问题在抽象类题在抽象类/接口部分解释)接口部分解释)super关键字关键字nthis代表本类引用,代表本类引用,super代表父类引用。代表父类引用。 super和和this的用法相同。的用法相同。n如果在子类中调用父类的同名方法,可以使用如果在子类中调用父类的同名方法,可以使用super关关键字调用。键字调用

14、。n当子类和父类出现同名成员的时候,可以使用当子类和父类出现同名成员的时候,可以使用super进进行区分。行区分。n子类要调用父类的构造方法的时候,可以使用子类要调用父类的构造方法的时候,可以使用super关关键字调用。键字调用。nthis和和super都可以調用構造方法,但是兩者是不可以同時出現都可以調用構造方法,但是兩者是不可以同時出現的,因為兩者調用構造時必須放在構造方法的首行。的,因為兩者調用構造時必須放在構造方法的首行。n無論子類如何操作,最終必須要首先調用父類中的構造方法。無論子類如何操作,最終必須要首先調用父類中的構造方法。nsuper关键字最重要的作用就是用基类有参数的构造方法

15、构造派关键字最重要的作用就是用基类有参数的构造方法构造派生类的对象。生类的对象。总结子类实例化过程总结子类实例化过程n子类中所有的构造方法函数都会访问父类子类中所有的构造方法函数都会访问父类中空参数的构造函数。因为每一个构造函中空参数的构造函数。因为每一个构造函数的第一行都有一条默认的语句数的第一行都有一条默认的语句super();n子类会具备父类中的数据,所以要先明确子类会具备父类中的数据,所以要先明确父类是如何对这些数据初始化的。父类是如何对这些数据初始化的。n当父类中没有空参数的构造函数时,子类当父类中没有空参数的构造函数时,子类的构造函数必须通过的构造函数必须通过this或者或者sup

16、er语句语句指定要访问的构造函数。指定要访问的构造函数。final关键字关键字nfinal可以修饰类,方法,变量。可以修饰类,方法,变量。nfinal修饰的类不可以被继承。修饰的类不可以被继承。nfinal修饰的方法不可以被覆盖。修饰的方法不可以被覆盖。nfinal修饰的变量是一个常量。只能被赋值一次。修饰的变量是一个常量。只能被赋值一次。n全局常量的声明全局常量的声明n使用使用static final關鍵字聯合聲明的變量稱為全局常量:關鍵字聯合聲明的變量稱為全局常量:npublic static final String INFO=“GJH”;n内部类只能访问内部类只能访问final修饰的局

17、部变量。修饰的局部变量。椅子大战的新需求(三)椅子大战的新需求(三)n现在需要重新定义各种形状旋转的度数现在需要重新定义各种形状旋转的度数n圆形圆形90度。度。n矩形矩形180度。度。n三角形三角形270度。度。n阿米巴形不变。阿米巴形不变。需求分析需求分析n现在发现,现在发现,rotate方法在父类中根本没有方法在父类中根本没有任何的作用,如果硬要写一些内容的话,任何的作用,如果硬要写一些内容的话,不是太浪费了?不是太浪费了?n所以最好的解决方案是在父类中只留一个所以最好的解决方案是在父类中只留一个声明,具体的实现放到子类中实现。声明,具体的实现放到子类中实现。n要想这样实现就必须依靠要想这

18、样实现就必须依靠“抽象类抽象类”。抽象类概述抽象类概述n抽象定义:抽象定义:n抽象就是从多个事物中将共性的,本质的内容抽取出来。抽象就是从多个事物中将共性的,本质的内容抽取出来。n例如:狼和狗共性都是犬科,犬科就是抽象出来的概念。例如:狼和狗共性都是犬科,犬科就是抽象出来的概念。n抽象类:抽象类:nJava中可以定义没有方法体的方法,该方法的具体实现由子类中可以定义没有方法体的方法,该方法的具体实现由子类完成,该方法称为抽象方法,包含抽象方法的类就是抽象类。完成,该方法称为抽象方法,包含抽象方法的类就是抽象类。 n抽象方法的由来:抽象方法的由来:n多个对象都具备相同的功能,但是功能具体内容有所

19、不同,那么多个对象都具备相同的功能,但是功能具体内容有所不同,那么在抽取过程中,只抽取了功能定义,并未抽取功能主体,那么只在抽取过程中,只抽取了功能定义,并未抽取功能主体,那么只有功能声明,没有功能主体的方法称为抽象方法。有功能声明,没有功能主体的方法称为抽象方法。n例如:狼和狗都有吼叫的方法,可是吼叫内容是不一样的。所以例如:狼和狗都有吼叫的方法,可是吼叫内容是不一样的。所以抽象出来的犬科虽然有吼叫功能,但是并不明确吼叫的细节。抽象出来的犬科虽然有吼叫功能,但是并不明确吼叫的细节。抽象类的特点抽象类的特点n抽象类和抽象方法必须用抽象类和抽象方法必须用abstract关键字来修饰。关键字来修饰

20、。n抽象方法只有方法声明,没有方法体,定义在抽象类中。抽象方法只有方法声明,没有方法体,定义在抽象类中。n格式:修饰符格式:修饰符 abstract 返回值类型返回值类型 函数名函数名(参数列表参数列表) ;n抽象类不可以被实例化,也就是不可以用抽象类不可以被实例化,也就是不可以用new创建对象。创建对象。原因如下:原因如下:n抽象类是具体事物抽取出来的,本身是不具体的,没有对应的实抽象类是具体事物抽取出来的,本身是不具体的,没有对应的实例。例如:犬科是一个抽象的概念,真正存在的是狼和狗。例。例如:犬科是一个抽象的概念,真正存在的是狼和狗。n而且抽象类即使创建了对象,调用抽象方法也没有意义。而

21、且抽象类即使创建了对象,调用抽象方法也没有意义。n抽象类通过其子类实例化,而子类需要覆盖掉抽象类中抽象类通过其子类实例化,而子类需要覆盖掉抽象类中所有的抽象方法后才可以创建对象,否则该子类也是抽所有的抽象方法后才可以创建对象,否则该子类也是抽象类。象类。抽象類的思考抽象類的思考n問題問題1:一個抽象類可以使用:一個抽象類可以使用final關鍵字關鍵字嗎?嗎?n問題問題2:一個抽象類中可以定義構造方法:一個抽象類中可以定義構造方法嗎?嗎?回答回答n問題一:問題一:n一個類如果使用了一個類如果使用了final關鍵字聲明,則此類關鍵字聲明,則此類不能被子類繼承,而抽象類又必須被子類覆寫,不能被子類繼

22、承,而抽象類又必須被子類覆寫,所以很明顯,第一個問題的答案是:所以很明顯,第一個問題的答案是:“一個抽一個抽象類不能使用象類不能使用final關鍵字聲明關鍵字聲明”。n問題二:問題二:n實際上在一個抽象類中允許存在構造方法,因實際上在一個抽象類中允許存在構造方法,因為抽象類依然使用的是類的繼承關係,而且抽為抽象類依然使用的是類的繼承關係,而且抽象類中也存在各個屬性,所以子類在實例化之象類中也存在各個屬性,所以子類在實例化之前一定要先對父類進行實例化。前一定要先對父類進行實例化。抽象類總結抽象類總結n包含一個抽象方法的類必須是抽象類。包含一個抽象方法的類必須是抽象類。n抽象類和抽象方法都要使用抽

23、象類和抽象方法都要使用abstract關鍵字聲明。關鍵字聲明。n抽象方法只可以聲明而不可以實現。抽象方法只可以聲明而不可以實現。n抽象類使用的時候一定要有子類。抽象類使用的時候一定要有子類。n子類仍然使用子類仍然使用extends關鍵字繼承一個抽象類,同樣會存在單繼關鍵字繼承一個抽象類,同樣會存在單繼承的關係。承的關係。n一個子類不能同時繼承多個抽象類。一個子類不能同時繼承多個抽象類。n子類(如果不是抽象類)必須覆寫抽象類中的全部抽象方法。子類(如果不是抽象類)必須覆寫抽象類中的全部抽象方法。n抽象類中絕對不能使用抽象類中絕對不能使用final關鍵字聲明。關鍵字聲明。n抽象類中允許有構造方法,

24、而且完全符合子類獨享的實抽象類中允許有構造方法,而且完全符合子類獨享的實例化過程。例化過程。椅子大战新的需求(四)椅子大战新的需求(四)n现在将每一种形状播放的声音进行更改现在将每一种形状播放的声音进行更改n圆形播放圆形播放cir文件的声音文件。文件的声音文件。n四方形播放四方形播放squ文件的声音文件。文件的声音文件。n三角形播放三角形播放tri文件的声音文件。文件的声音文件。n阿米巴形不变。阿米巴形不变。需求分析需求分析n现在遇到了和抽象类中一样的问题,就是现在遇到了和抽象类中一样的问题,就是playSound方法在父类中也失去了作用,方法在父类中也失去了作用,当然按照抽象类的方法可以将这

25、个方法也当然按照抽象类的方法可以将这个方法也声明为抽象方法。声明为抽象方法。n这个时候可以看出,父类中的所有的方法这个时候可以看出,父类中的所有的方法都是抽象方法了,这实际上就变成了一个都是抽象方法了,这实际上就变成了一个“接口接口”。接口的概念及定义接口的概念及定义n接口可以理解為一種特殊的類,裡面全部接口可以理解為一種特殊的類,裡面全部是由全局常量和公共的抽象方法組成。是由全局常量和公共的抽象方法組成。n成员常量:成员常量:public static finaln成员方法:成员方法:public abstractn接口的定義格式接口的定義格式n權限限定權限限定 interface 接口名稱

26、接口名稱 n 全局變量全局變量;n 抽象方法抽象方法;n實現接口實現接口n與抽象類一樣,接口若要使用也必須通過子類,與抽象類一樣,接口若要使用也必須通過子類,子類通過子類通過implements關鍵字實現接口。關鍵字實現接口。 n實現格式:實現格式:npublic class 子類子類 implements 接口接口A,接口,接口B,n n接口的出现将接口的出现将“多继承多继承”通过另一种形式体现出通过另一种形式体现出来,即来,即“多实现多实现”,这就可以弥补,这就可以弥补Java在类的在类的继承中只可以单继承的局限。继承中只可以单继承的局限。接口的特点接口的特点n接口是对外暴露的规则。接口是

27、对外暴露的规则。n接口是程序的功能扩展。接口是程序的功能扩展。n接口可以用来多实现。接口可以用来多实现。n类与接口之间是实现关系,而且类可以继类与接口之间是实现关系,而且类可以继承一个类的同时实现多个接口。承一个类的同时实现多个接口。n接口与接口之间可以有继承关系。接口与接口之间可以有继承关系。椅子大战的编码需求(五)椅子大战的编码需求(五)n在客户端需要编写两个方法在客户端需要编写两个方法ntestPlaySound方法:可以测试所有形状的方法:可以测试所有形状的声音。声音。ntestRotate方法:可以测试所有形状的旋转。方法:可以测试所有形状的旋转。需求分析需求分析n按照以前的知识,要

28、想实现前面的内容,按照以前的知识,要想实现前面的内容,就必须要写多个方法,那么如何实现一个就必须要写多个方法,那么如何实现一个方法可以接受不同形状的调用呢?方法可以接受不同形状的调用呢?n解决方案就是使用面向对象中最重要的概解决方案就是使用面向对象中最重要的概念念“多态多态”。多态的概念多态的概念n定义:某一类事物的多种存在形态。定义:某一类事物的多种存在形态。 n例:动物中猫,狗。例:动物中猫,狗。 n猫这个对象对应的类型是猫类型猫这个对象对应的类型是猫类型n猫猫 x = new 猫猫();n同时猫也是动物中的一种,也可以把猫称为同时猫也是动物中的一种,也可以把猫称为 动动物。物。n动物动物

29、 y = new 猫猫();n动物是猫和狗具体事物中抽取出来的父类型。动物是猫和狗具体事物中抽取出来的父类型。n父类型引用指向了子类对象,这实际上就是向上父类型引用指向了子类对象,这实际上就是向上转型。转型。多态的概念多态的概念n体现:体现:n父类或者接口的引用指向或者接收自己的子类父类或者接口的引用指向或者接收自己的子类对象。对象。n作用:作用:n多态的存在提高了程序的扩展性和后期可维护多态的存在提高了程序的扩展性和后期可维护性。性。n前提:前提:n需要存在继承或者实现关系。需要存在继承或者实现关系。n要有覆盖操作。要有覆盖操作。多态的特点多态的特点n方法:方法:n编译时:要查看引用变量所属

30、的类中是否有所编译时:要查看引用变量所属的类中是否有所调用的成员。调用的成员。n在运行时:要查看对象所属的类中是否有所调在运行时:要查看对象所属的类中是否有所调用的成员。用的成员。n属性:属性:n只看引用变量所属的类。只看引用变量所属的类。椅子大战的新需求(六)椅子大战的新需求(六)n需要在输出声音之前提示用户需要在输出声音之前提示用户“即将开始即将开始播放声音播放声音”。n需要在输出声音之后提示用户需要在输出声音之后提示用户“声音播放声音播放已经结束已经结束”。n需要在旋转之前提示用户需要在旋转之前提示用户“即将开始旋转即将开始旋转”。n需要在旋转之后提示用户需要在旋转之后提示用户“旋转已经

31、结束旋转已经结束”。需求分析需求分析n按照以前的继续写的话有一个问题,就是按照以前的继续写的话有一个问题,就是需要重复编写四个方法的代码,这样就变需要重复编写四个方法的代码,这样就变得很浪费。得很浪费。n但是如果要重新改成继承抽象方法,那么但是如果要重新改成继承抽象方法,那么接口的一个重要的特点接口的一个重要的特点多继承就会失去,多继承就会失去,那么怎样可以更好的设计呢?那么怎样可以更好的设计呢?n答案就是将接口和抽象类一并使用。答案就是将接口和抽象类一并使用。面向对象设计的原则面向对象设计的原则n一般的做法就是在类设计的顶层使用接口。一般的做法就是在类设计的顶层使用接口。n然后设计一个抽象类实现接口,同时将重然后设计一个抽象类实现接口,同时将重复的代码放入抽象类。复的代码放入抽象类。n其它的具体类继承抽象类。其它的具体类继承抽象类。n注意:注意:n一个具体类一定是叶子类。一个具体类一定是叶子类。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号