资源预览内容
第1页 / 共44页
第2页 / 共44页
第3页 / 共44页
第4页 / 共44页
第5页 / 共44页
第6页 / 共44页
第7页 / 共44页
第8页 / 共44页
第9页 / 共44页
第10页 / 共44页
亲,该文档总共44页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第3章 面向对象程序设计高级郭建宏椅子大戰n從前,有一間軟件小鋪,裡面有兩個程 序員被指派去設計一個程序。n壞心的老闆娘兼項目經理要求兩個人比 賽,贏的人可以坐上象徵身份地位的 AeronTM寶椅。n程序開發高手阿珠和面向對象的信徒阿 花兩個人都相信自己贏的可能性很大。需求n在图形接口中画出四方形(squre),圆 形(circle)和三角形(triangle),图 形需要顺时针绕中心旋转,同时输出AIF 音效文件。阿珠是怎樣做的?n和以往一样,阿珠准备好开始设计重要的程序。 没几下就写出了rotate和playSound方法。nrotate() n / 绕中心旋转360度。nnplaySound() n / 播放aif文件。n阿花是怎樣做的?n阿花分别为三个形状各写出一个类。新的需求(一)n前面的形状需要加上阿米巴原虫(Amoeba)形状。n用户点选时也是旋转并播放.hif的声音文件。阿珠该怎样做?n原来的rotate程序还可以用。n但是playSound就得要修改。n虽然修改的幅度不大,但是阿珠实在不想去碰已 经测试过的程序代码。他应该很清楚,不管项目 经理怎么保证,需求就是会不停的改。nplaySound(shapeNum) / 参数用来标 识传入的是否是amoeba图形n / 如果不是阿米巴形状,则播放.aif文件。n / 如果是则播放.hif文件n阿花該怎樣做?n阿花则写出一个新的类。n面向对象让他最喜欢的其中一点就是有时不需改 动已经测试好的程序就可以达成新的目标。n面向对象的适应性和可扩展性让他面对修改时不 会觉得太痛苦。新的需求(二)n阿米巴虫在旋转的时候需要以给定的作为 原点旋转。阿珠該怎樣做?n阿珠最好还是帮rotate程序加上轴心点的 参数。这样就有一堆程序要改。n本来已经测试好的东西全部又得重来一遍 。nrotate(shapeNum, xPt, yPt)n / 如果不是阿米巴,则绕中心旋转。n / 否则以xPt和yPt作为旋转中心旋转 。n阿花该怎样做n阿花修改rotate这个方 法,但不是每个都要修 改,只修改Amoeba这 个类而已。n其他已经测试、编译过 的部分完全没有必要修 改。n该类需要的修改就是加 上旋转轴心点的属性。问题的解决n从上面的分析可以看出,阿花的设计是非 常好的。n但是还有一个问题,在每个类中rotate和 playSound有很多都是重复的。这样做太 没有效率了。该怎样解决这样的问题呢?n答案就是应用“继承”来解决。怎樣繼承继承概述n多个类中存在相同属性和行为时,将这些内容抽取到单 独一个类中,那么多个类无需再定义这些属性和行为, 只要继承单独的那个类即可。n多个类可以称为子类,单独这个类称为父类或者超类。n通过extends关键字让类与类之间产生继承关系。nclass SubDemo extends Demon子类继承父类后,都继承了父类的那些哪些成员呢?n子类继承了父类的属性,包括私有属性。n子类继承了除构造方法外的其他所有方法。n问题:n为什么子類對象在實例化之前必須首先調用父類中的構造方法之 後再調用子類自己的構造方法?继承的特点nJava只支持单继承,不支持多继承。n一个类只能有一个父类,不可以有多个父类。nclass SubDemo extends Demo /oknclass SubDemo extends Demo1,Demo2./errorn Java支持多层继承(继承体系)nclass Anclass B extends Anclass C extends Bn子类对象实例化n子類對象在實例化之前必須首先調用父類中的構造方法之後再調 用子類自己的構造方法。n定义继承需要注意n不要仅为了获取其他类中的某个功能而去继承。n类与类之间要有所属(“is a”)的关系,xx1是xx2的一种。阿米巴的rotate该怎么办?n阿米巴形状会需要完全不同的rotate和 playSound程序,如果都继承Shape,那 旋转的功能就都一样了。n解决方法:Amoeba这个类可以覆盖( override)Shape的方法。(多态)阿米巴的rotate该怎么办?方法覆写(Override)n子类中出现与父类一模一样的方法时,会出现覆盖操作 ,也称为重写或者复写。n父类中的私有方法不可以被覆盖。n在子类覆盖方法中,继续使用被覆盖的方法可以通过 “super.函数名”获取(super关键字部分介绍)。n覆盖注意事项n覆盖时,子类方法权限一定要大于父类方法权限。nprivateprotecteddefaultpublicn静态只能覆盖静态。n覆盖的应用n当子类需要父类的功能,而功能主体子类有自己特有内容时,可 以复写父类中的方法,这样,即沿袭了父类的功能,又定义了子 类特有的内容。重载和覆写的区别No.区别点重载覆写 1定义方法名称相同,参 数类型、个数或顺 序不同。方法名称、参数或个数、 返回值类型相同。2权限没有权限要求被覆写的方法不能拥有比 父类更严格的权限。 3范围发生在同一个类中 发生在继承关系中 4单词OverLoadingOverride继承的意义n继承的出现提供了代码的复用性。n继承的出现让类与类之间产生了关系,提 供了多态的前提。n子类继承父类可以扩展已有类的功能。n在工程中,父类一般都提供一个接口。(此问 题在抽象类/接口部分解释)super关键字nthis代表本类引用,super代表父类引用。 super和this 的用法相同。n如果在子类中调用父类的同名方法,可以使用super关 键字调用。n当子类和父类出现同名成员的时候,可以使用super进 行区分。n子类要调用父类的构造方法的时候,可以使用super关 键字调用。nthis和super都可以調用構造方法,但是兩者是不可以同時出現 的,因為兩者調用構造時必須放在構造方法的首行。n無論子類如何操作,最終必須要首先調用父類中的構造方法。nsuper关键字最重要的作用就是用基类有参数的构造方法构造派 生类的对象。总结子类实例化过程n子类中所有的构造方法函数都会访问父类 中空参数的构造函数。因为每一个构造函 数的第一行都有一条默认的语句super();n子类会具备父类中的数据,所以要先明确 父类是如何对这些数据初始化的。n当父类中没有空参数的构造函数时,子类 的构造函数必须通过this或者super语句 指定要访问的构造函数。final关键字nfinal可以修饰类,方法,变量。nfinal修饰的类不可以被继承。nfinal修饰的方法不可以被覆盖。nfinal修饰的变量是一个常量。只能被赋值一次 。n全局常量的声明n使用static final關鍵字聯合聲明的變量稱為全局常量:npublic static final String INFO=“GJH”;n内部类只能访问final修饰的局部变量。椅子大战的新需求(三)n现在需要重新定义各种形状旋转的度数n圆形90度。n矩形180度。n三角形270度。n阿米巴形不变。需求分析n现在发现,rotate方法在父类中根本没有 任何的作用,如果硬要写一些内容的话, 不是太浪费了?n所以最好的解决方案是在父类中只留一个 声明,具体的实现放到子类中实现。n要想这样实现就必须依靠“抽象类”。抽象类概述n抽象定义:n抽象就是从多个事物中将共性的,本质的内容抽取出来。n例如:狼和狗共性都是犬科,犬科就是抽象出来的概念。n抽象类:nJava中可以定义没有方法体的方法,该方法的具体实现由子类 完成,该方法称为抽象方法,包含抽象方法的类就是抽象类。 n抽象方法的由来:n多个对象都具备相同的功能,但是功能具体内容有所不同,那么 在抽取过程中,只抽取了功能定义,并未抽取功能主体,那么只 有功能声明,没有功能主体的方法称为抽象方法。n例如:狼和狗都有吼叫的方法,可是吼叫内容是不一样的。所以 抽象出来的犬科虽然有吼叫功能,但是并不明确吼叫的细节。抽象类的特点n抽象类和抽象方法必须用abstract关键字来修饰。n抽象方法只有方法声明,没有方法体,定义在抽象类中 。n格式:修饰符 abstract 返回值类型 函数名(参数列表) ;n抽象类不可以被实例化,也就是不可以用new创建对象 。原因如下:n抽象类是具体事物抽取出来的,本身是不具体的,没有对应的实 例。例如:犬科是一个抽象的概念,真正存在的是狼和狗。n而且抽象类即使创建了对象,调用抽象方法也没有意义。n抽象类通过其子类实例化,而子类需要覆盖掉抽象类中 所有的抽象方法后才可以创建对象,否则该子类也是抽 象类。抽象類的思考n問題1:一個抽象類可以使用final關鍵字 嗎?n問題2:一個抽象類中可以定義構造方法 嗎?回答n問題一:n一個類如果使用了final關鍵字聲明,則此類 不能被子類繼承,而抽象類又必須被子類覆寫 ,所以很明顯,第一個問題的答案是:“一個 抽象類不能使用final關鍵字聲明”。n問題二:n實際上在一個抽象類中允許存在構造方法,因 為抽象類依然使用的是類的繼承關係,而且抽 象類中也存在各個屬性,所以子類在實例化之 前一定要先對父類進行實例化。抽象類總結n包含一個抽象方法的類必須是抽象類。n抽象類和抽象方法都要使用abstract關鍵字聲明。n抽象方法只可以聲明而不可以實現。n抽象類使用的時候一定要有子類。n子類仍然使用extends關鍵字繼承一個抽象類,同樣會存在單繼 承的關係。n一個子類不能同時繼承多個抽象類。n子類(如果不是抽象類)必須覆寫抽象類中的全部抽象方法。n抽象類中絕對不能使用final關鍵字聲明。n抽象類中允許有構造方法,而且完全符合子類獨享的實 例化過程。椅子大战新的需求(四)n现在将每一种形状播放的声音进行更改n圆形播放cir文件的声音文件。n四方形播放squ文件的声音文件。n三角形播放tri文件的声音文件。n阿米巴形不变。需求分析n现在遇到了和抽象类中一样的问题,就是 playSound方法在父类中也失去了作用, 当然按照抽象类的方法可以将这个方法也 声明为抽象方法。n这个时候可以看出,父类中的所有的方法 都是抽象方法了,这实际上就变成了一个“ 接口”。接口的概念及定义n接口可以理解為一種特殊的類,裡面全部 是由全局常量和公共的抽象方法組成。n成员常量:public static finaln成员方法:public abstractn接口的定義格式n權限限定 interface 接口名稱 n 全局變量;n 抽象方法;n實現接口n與抽象類一樣,接口若要使用也必須通過子類, 子類通過implements關鍵字實現接口。 n實現格式:npublic class 子類 implements 接口A,接口B, n n接口的出现将“多继承”通过另一种形式体现出来 ,即“多实现”,这就可以弥补Java在类的继承 中只可以单继承的局限。接口的特点n接口是对外暴露的规则。n接口是程序的功能扩展。n接口可以用来多实现。n类与接口之间是实现关系,而且类可以继 承一个类的同时实现多个接口。n接口与接口之间可以有继承关系。椅子大战的编码需求(五)n在客户端需要编写两个方法ntestPlaySound方法:可以测试所有形状的 声音。ntestRotate方法:可以测试所有形状的旋转 。需求分析n按照以前的知识,要想实现前面的内容, 就必须要写多个方法,那么如何实现一个 方法可以接受不同形状的调用呢?n解决方案就是使用面向对象中最重要的概 念“多态”。多态的概念n定义:某一类事物的多种存在形态。 n例:动物中猫,狗。 n猫这个对象对应的类型是猫类型n猫 x = new 猫();n同时猫也是动物中的一种,也可以把猫称为 动 物。n动物 y = new 猫();n动物是猫和狗具体事物中抽取出来的父类型。n父类型引用指向了子类对象,这实际上就是向上 转型。多态的概念n体现:n父类或者接口的引用指向或者接收自己的子类 对象。n作用:n多态的存在提高了程序的扩展
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号