《第3章Java面向对象程序设计.ppt》由会员分享,可在线阅读,更多相关《第3章Java面向对象程序设计.ppt(85页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第三章第三章 JavaJava面向对象程序设计面向对象程序设计面向对象概述面向对象概述 3.1类与对象类与对象3.2成员变量和成员方法成员变量和成员方法3.3继承与多态继承与多态3.4包、接口与内部类包、接口与内部类3.5万物皆对象万物皆对象v世界是由什么组成的?名胜名胜人人物品物品 动物动物 ,植物,植物 身边的对象身边的对象布兰尼布兰尼朱丽叶朱丽叶顾客顾客姓名:朱丽叶姓名:朱丽叶年龄:年龄:28体重:体重:52千克千克操作:操作:购买商品购买商品姓名:布兰尼姓名:布兰尼职衔:收银员职衔:收银员年龄:年龄:35体重:体重:60千克千克操作:操作:收款收款打印账单打印账单对象的特征对象的特征属
2、性属性v属性对象具有的各种特征v每个对象的每个属性都拥有特定值例如:布兰尼和朱丽叶的体重不一样60kg布兰尼布兰尼属性属性35岁岁收银员布兰尼收银员布兰尼 对象的特征对象的特征方法方法v方法对象执行的操作打单打单收银收银方法方法刷卡刷卡收银员布兰尼收银员布兰尼对象的属性和方法对象的属性和方法v列出尼古拉斯凯奇驾驶的这辆法拉利F360 Spider的属性和方法v列出小狗对象的属性和方法属性:属性:品牌:法拉利品牌:法拉利型号:型号:F360Spider颜色:黄色颜色:黄色价格:价格:380万元万元方法:方法:发动发动停止停止加速加速属性:属性:颜色:白色颜色:白色方法:方法:叫叫跑跑吃吃小结小结
3、1v说一说教室里的对象v描述他们的属性和方法 颜色:黑色颜色:黑色品牌:品牌:BENQ投影投影姓名:张三姓名:张三年龄:年龄:20学习学习类型:白炽灯类型:白炽灯开开关关变亮变亮变暗变暗材制材制:木质木质支撑物品支撑物品封装封装v对象同时具有属性和方法两项特性v对象的属性和方法通常被封装在一起,共同体现事物的特性,二者相辅相承,不能分割谁看见过只有谁看见过只有“完好完好的零件和颜色的零件和颜色”而不而不能开动的汽车?能开动的汽车?从对象抽象出从对象抽象出“类类”抽取出下列对象的属性和方法的共同特征 顾客顾客类类顾客类轿车类 类是模子,确定对象将会拥有的类是模子,确定对象将会拥有的特征(属性)和
4、行为(方法)特征(属性)和行为(方法)v类是对象的类型不同于int类型:具有方法 各种口味的球状冰淇淋各种口味的球状冰淇淋球状冰淇淋模子球状冰淇淋模子小结小结2v类和对象有什么区别呢?类是抽象的概念,仅仅是模板,比如说:“人”对象是一个你能够看得到、摸得着的具体实体,比如:“小布什”小布什小布什普京普京克林顿克林顿“人”类特征(属性)年龄体重行为(方法)衣食住行Java是面向对象的语言是面向对象的语言v所有Java程序都以类class为组织单元v关键字class定义自定义的数据类型 publicclassHellopublicstaticvoidmain(Stringargs)System.o
5、ut.println(使用使用Java语言理解程序逻辑语言理解程序逻辑);Java类模板类模板v类将现实世界中的概念模拟到计算机程序中publicclass类名类名/定义属性部分定义属性部分属性属性1的类型的类型属性属性1;属性属性2的类型的类型属性属性2;属性属性n的类型的类型属性属性n;/定义方法部分定义方法部分方法方法1;方法方法2;方法方法m;定义类定义类v定义一个类的步骤1、定义类名2、编写类的属性3、编写类的方法类示例类示例2-1用类的思想输出计算机培训中心信息AccpSchool类属性:中心全称中心教室数目中心机房数目方法:展示中心信息类示例类示例2-2publicclassAc
6、cpSchool/定义定义培训培训中心的属性中心的属性StringschoolName;/中心的全称中心的全称intclassNum;/教室的数目教室的数目intlabNum;/机房的数目机房的数目/定义定义培训中心的方法培训中心的方法publicStringtoString()returnschoolName+培训培训ACCP学员学员+n+配备配备:+classNum+教教+labNum+机机;定义类的定义类的toString()方法,方法,用于输出类相关的信息用于输出类相关的信息publicStringtoString()return字符串;字符串;/方法体方法体成员变量成员变量常见错误常
7、见错误publicclass.BookStringbookName;StringauthorName;intpageNum;booleanisAvailable;类命名规则:类命名规则:1、不能使用、不能使用Java关键字关键字2、首字母可以为字母,也可以是、首字母可以为字母,也可以是“_”或或“$”(建议不要建议不要这样这样)3、不能包含空格或、不能包含空格或“.”号号代码错误代码错误如何创建和使用对象如何创建和使用对象v使用对象的步骤:使用new创建类的一个对象使用对象:使用“.”进行以下操作给类的属性赋值:对象名.属性调用类的方法:对象名.方法名()AccpSchoolcenter=ne
8、wAccpSchool();center.schoolName=北京中心北京中心;/给属性赋值给属性赋值center.toString();/调用类的方法,该方法中的操作将被执调用类的方法,该方法中的操作将被执行行publicclassInitialAccpSchool publicstaticvoidmain(Stringargs)AccpSchoolcenter=newAccpSchool();System.out.println(center);center.schoolName=北京中心北京中心;center.classNum=10;center.labNum=10;System.ou
9、t.println(center);创建和使用对象示例创建和使用对象示例创建创建“北京中心北京中心”对象对象说一说看到说一说看到什么效果?什么效果?调用类的调用类的toString()方法是特方法是特例:这里使用例:这里使用center.toString()和和center作用相同作用相同更简便更简便综合案例综合案例v编写学生类,输出学生相关信息v编写教员类,输出教员相关信息学生类属性:姓名年龄参加的课程兴趣方法:显示学员个人信息教员类属性:姓名专业方向教授的课程教龄方法:显示教员个人信息小结小结3v编写一个手机类,并编写测试类显示手机信息为什么需要封装为什么需要封装2-1v编写一个类,代表教
10、员,要求:具有属性:姓名、年龄具有行为:自我介绍教师的最小年龄要求:22岁publicclassTeacher1publicStringname;/教员姓名教员姓名publicintage;/年龄年龄/*返回自我介绍的内容返回自我介绍的内容*/publicStringintroduction()return大家好!我是大家好!我是+name+,我今年我今年+age+岁岁;为什么需要封装为什么需要封装2-2v编写一个测试类,要求:实例化一个教员对象,并对其初始化在控制台输出该教员的自我介绍publicclassTeacher1Testpublicstaticvoidmain(Stringargs
11、)Teacher1teacher=newTeacher1();teacher.name=李芳李芳;teacher.age=10;System.out.println(teacher.introduction();要满足教员的最小年龄要求,可以通过对属性的封装来实现要满足教员的最小年龄要求,可以通过对属性的封装来实现大家好!我是李芳,我今年大家好!我是李芳,我今年1010岁岁什么是封装什么是封装publicclassTeacher2privateStringname;/教员姓名教员姓名/返回教员姓名返回教员姓名publicStringgetName()returnname;/设定教员姓名设定教员
12、姓名publicvoidsetName(Stringname)this.name=name;封装,就是隐藏实现细节将属性私有化,提供公有方法访问私有属性通过这些公有方法访问私有属性 Teacher2teacher=newTeacher2();teacher.setName(李芳李芳);StringtName=teacher.getName();通过通过setter、getter方法方法访问访问name属性属性this代表当前类的实例代表当前类的实例如何实现封装如何实现封装2-1v封装的实现:1、修改属性的可见性来限制对属性的访问2、为每个属性创建一对赋值(setter)方法和取值(getter
13、)方法,用于对这些属性的访问3、在setter和getter方法中,加入对属性的存取限制publicclassTeacher3privateStringname;/教员姓名教员姓名privateintage;/年龄年龄publicintgetAge()returnage;publicvoidsetAge(intage)if(age22)System.out.println(错误!最小年龄应为错误!最小年龄应为22岁!岁!);this.age=22;/如果不符合年龄要求,则赋予默认值如果不符合年龄要求,则赋予默认值elsethis.age=age;/此处省略对此处省略对name属性的属性的set
14、ter、getter方法方法123如何实现封装如何实现封装2-2publicclassTeacher3Testpublicstaticvoidmain(Stringargs)Teacher3teacher=newTeacher3();teacher.setName(李芳李芳);teacher.setAge(10);System.out.println(teacher.introduction();使用封装,增加了数据访问限制,增强了程序的可维护性使用封装,增加了数据访问限制,增强了程序的可维护性错误!最小年龄应为错误!最小年龄应为22岁!岁!大家好!我是李芳,我今年大家好!我是李芳,我今年22
15、岁岁测试类通过调用setter方法,为对象的各个属性赋值小结小结4v使用private关键字修饰某个成员变量后,这个成员变量可以被同一包中的其它类访问吗?v在Java程序中,代码封装带给我们的好处是什么?小结小结5v请通过代码封装,实现如下需求:编写一个类Book,代表教材:具有属性:名称(具有属性:名称(title)、页数()、页数(pageNum),其中页数不),其中页数不能少于能少于200页,否则输出错误信息,并赋予默认值页,否则输出错误信息,并赋予默认值200为各属性设置赋值和取值方法为各属性设置赋值和取值方法具有方法具有方法:detail,用来在控制台输出每本教材的名称和页,用来在控
16、制台输出每本教材的名称和页数数编写测试类BookTest进行测试:为Book对象的属性赋予初始值,并调用Book对象的detail方法,看看输出是否正确为什么需要构造方法为什么需要构造方法2-1v开发教员类Teacher4,要求:具有属性:姓名、年龄、学历、职位具有行为:自我介绍publicclassTeacher4privateStringname;/姓名姓名privateintage;/年龄年龄privateStringeducation;/学历学历privateStringposition;/职位职位publicStringintroduction()return大家好!我是大家好!我是
17、+name+,我今年,我今年”+age+岁,学历岁,学历“+education+,目前职位是,目前职位是+position;publicStringgetName()returnname;publicvoidsetName(StringmyName)name=myName;/以下是其他属性的以下是其他属性的setter、getter方法,此处省略方法,此处省略为什么需要构造方法为什么需要构造方法2-2v编写一个测试类,要求:实例化一个教员对象,并对其初始化在控制台输出该教员的自我介绍publicclassTeacher4Testpublicstaticvoidmain(Stringargs)T
18、eacher4teacher=newTeacher4();teacher.setName(李芳李芳);teacher.setAge(23);teacher.setEducation(本科本科);System.out.println(teacher.introduction();要简化对象初始化的代码,可以通过构造方法来解决要简化对象初始化的代码,可以通过构造方法来解决大家好!我是李芳大家好!我是李芳,我今年我今年23岁,学历本科,目前职位是岁,学历本科,目前职位是nullAccpTeacher4中有太多中有太多的属性及对应的的属性及对应的setter方方法,在初始化时,很容易法,在初始化时,很
19、容易就忘记了,有没有可能简就忘记了,有没有可能简化对象初始化的代码?化对象初始化的代码?什么是构造方法什么是构造方法v构造方法负责对象成员的初始化工作,为实例变量赋予合适的初始值v构造方法必须满足以下语法规则:1、方法名与类名相同2、没有返回类型publicclassTeacher5privateStringname;/教员姓名教员姓名/构造方法构造方法publicTeacher5()name=无名氏无名氏;publicclassTeacher5Testpublicstaticvoidmain(Stringargs)Teacher5teacher=newTeacher5();v使用new关键字
20、调用构造方法带参数的构造方法带参数的构造方法2-1v通过带参数的构造方法,显式地为实例变量赋予初始值 publicclassTeacher6privateStringname;/教员姓名教员姓名privateintage;/年龄年龄privateStringeducation;/学历学历privateStringposition;/职位职位/带参数的构造方法带参数的构造方法publicTeacher6(StringpName,intpAge,StringpEducation,StringpPosition)name=pName;age=pAge;/可以增加对可以增加对age等属性的存取限制条件
21、等属性的存取限制条件education=pEducation;position=pPosition;publicStringintroduction()return大家好!我是大家好!我是+name+,我今年,我今年+age+岁,学历岁,学历+education+,目前职位是目前职位是+position;带参数的构造方法带参数的构造方法2-2v通过调用带参数的构造方法,简化对象初始化的代码publicclassTeacher6Testpublicstaticvoidmain(Stringargs)Teacher6teacher=newTeacher6(李芳李芳,23,本科本科,咨询师咨询师);
22、System.out.println(teacher.introduction();创建对象时,一并完成了对创建对象时,一并完成了对象成员的初始化工作象成员的初始化工作大家好!我是李芳大家好!我是李芳,我今年我今年23岁,学历本科,目前职位是咨询师岁,学历本科,目前职位是咨询师小结小结6编写一个类Book2,代表教材:具有属性:名称(具有属性:名称(title)、页数()、页数(pageNum),其中页),其中页数不能少于数不能少于200页,否则输出错误信息,并赋予默认值页,否则输出错误信息,并赋予默认值200具有方法:具有方法:detail,用来在控制台输出每本教材的名称和,用来在控制台输出
23、每本教材的名称和页数。页数。具有带参数的构造方法:用来完成对象的初始化工作,并具有带参数的构造方法:用来完成对象的初始化工作,并在构造方法中完成对页数的最小值限制在构造方法中完成对页数的最小值限制编写测试类Book2Test进行测试:初始化一个Book2对象,并调用该Book2对象的detail方法,看看输出是否正确生活中的方法重载生活中的方法重载类类方法方法方法参数方法参数方法实现方法实现司机司机轿车轿车巴士巴士火车火车驾驶驾驶启动、行驶、启动、行驶、等待乘客上车、启动、等待乘客上车、启动、行驶、到站停车、行驶、到站停车、正点发车、行驶、正点发车、行驶、到站停车、到站停车、如果用代码实现,我
24、们需要三个方法,这些方法的方法名称如果用代码实现,我们需要三个方法,这些方法的方法名称相同,参数类型不同相同,参数类型不同方法重载的代码示例方法重载的代码示例1v方法重载并不陌生vjava.io.PrintStream类的println方法能够打印数据并换行,根据数据类型的不同,有多种实现方式publicclassTestpublicstaticvoidmain(Stringargs)inti=0;charc=z;Stringstr=hello;System.out.println(i);System.out.println(c);System.out.println(str);PrintSt
25、reamprintln(int)println(char)println(String)方法名相同,参数类型不同方法名相同,参数类型不同调用不同的调用不同的println方法方法方方法法重重载载方法重载的代码示例方法重载的代码示例2java.lang.Math类的max()方法能够从两个数字中取出最大值,它有多种实现方式运行时,Java虚拟机先判断给定参数的类型,然后决定到底执行哪个max()方法Mathmax(inta,intb)max(floata,floatb)max(longa,longb)max(doublea,doubleb)publicclassTestpublicstaticv
26、oidmain(Stringargs)Math.max(1,2);Math.max(1.0F,2.F);Math.max(1.0,2);方方法法重重载载构造方法重载构造方法重载2-1v构造方法重载是方法重载的典型示例publicclassTeacher7privateStringname;/教员姓名教员姓名privateStringschool=北京中心北京中心;/所在中心所在中心publicTeacher7(Stringname)this.name=name;/设定教员姓名设定教员姓名publicTeacher7(Stringname,Stringschool)this.name=name;
27、/设定教员姓名设定教员姓名this.school=school;/设定教员的所在中心设定教员的所在中心publicStringintroduction()return大家好!我是大家好!我是+school+的的+name;构构造造方方法法重重载载构造方法重载构造方法重载2-2v通过调用不同的构造方法来表达对象的多种初始化行为v例如:默认情况下,教师来自北京中心,初始化时,只需提供教员姓名有时,需要提供所在中心名称及教员姓名publicclassTeacher7Testpublicstaticvoidmain(Stringargs)Teacher7teacher1=newTeacher7(李芳李
28、芳);System.out.println(teacher1.introduction();Teacher7teacher2=newTeacher7(张欣张欣,天津中心天津中心);System.out.println(teacher2.introduction();大家好!我是北京中心的李芳大家好!我是北京中心的李芳大家好!我是天津中心的张欣大家好!我是天津中心的张欣小结小结7编写一个类Book3,代表教材:具有属性:名称(title)、页数(pageNum)、种类(type)具有方法:detail,用来在控制台输出每本教材的名称、页数、种类具有两个带参构造方法:第一个构造方法中,设置教材种类
29、为“计算机”(固定),其余属性的值由参数给定;第二个构造方法中,所有属性的值都由参数给定v编写测试类Book3Test进行测试:分别以两种方式完成对两个Book3对象的初始化工作,并分别调用它们的detail方法,看看输出是否正确给定如下Java代码,请指出代码中的错误,并解释原因。publicclassSampleprivateintx;publicSample()x=1;publicSample(inti)x=i;publicintSample(inti)x=i;returnx+;privateSample(inti,Strings)publicSample(Strings,inti)pr
30、ivateSampla(inti)x=i+;privatevoidSampla(inti)x=i+;总结总结无参构造方法无参构造方法带参构造方法带参构造方法不是构造方法不是构造方法带参构造方法带参构造方法带参构造方法带参构造方法名称与类名不相同名称与类名不相同不是构造方法不是构造方法生活中的继承生活中的继承2-1v生活中,继承的例子随处可见动物动物食草动物食草动物食肉动物食肉动物谁是父类?谁是父类?谁是子类?谁是子类?能说出继承的特点吗?能说出继承的特点吗?继承需要符合的关系:继承需要符合的关系:is-a,父类更通用、子类更具体,父类更通用、子类更具体生活中的继承生活中的继承2-2v子类具有父
31、类的一般特性(包括属性和行为),以及自身特殊的特性巴士是汽车吗?巴士是汽车吗?卡车是汽车吗?卡车是汽车吗?出租车是汽车吗?出租车是汽车吗?最大载客数量最大载客数量报站报站引擎数量引擎数量外观颜色外观颜色刹车刹车加速加速汽车汽车最大载重量最大载重量卸货卸货所属公司所属公司最大载客数量最大载客数量打发票打发票属性属性行为行为请问:出租车请问:出租车包含哪些属性包含哪些属性和行为呢?和行为呢?为什么需要继承为什么需要继承4-1v开发ACCP教员类,其中教员分为Java教员以及.NET教员,各自的要求如下:Java教员属性:姓名、所属中心属性:姓名、所属中心方法:授课(步骤:打开方法:授课(步骤:打开
32、Eclipse、实施理论课授课)、自我、实施理论课授课)、自我介绍介绍.NET教员属性:姓名、所属中心属性:姓名、所属中心方法:授课(步骤:打开方法:授课(步骤:打开Visualstudio2005、实施理论课授、实施理论课授课)、自我介绍课)、自我介绍v请问:以下这个解决方案中存在着什么问题?为什么需要继承为什么需要继承4-2publicclassAccpDotNetTeacherprivateStringname;/教员姓名教员姓名privateStringschool;/所在中心所在中心publicAccpDotNetTeacher(StringmyName,StringmySchool
33、)name=myName;school=mySchool;publicvoidgiveLession()System.out.println(启动启动VisualStudio2005);System.out.println(知识点讲解知识点讲解);System.out.println(总结提问总结提问);publicvoidintroduction()System.out.println(大家好!我是大家好!我是+school+的的+name+.);publicclassAccpJavaTeacherprivateStringname;/教员姓名教员姓名privateStringschool;
34、/所在中心所在中心publicAccpJavaTeacher(StringmyName,StringmySchool)name=myName;school=mySchool;publicvoidgiveLession()System.out.println(启动启动Eclipse);System.out.println(知识点讲解知识点讲解);System.out.println(总结提问总结提问);publicvoidintroduction()System.out.println(大家好!我是大家好!我是+school+的的+name+.);代码存在重复,违背了代码存在重复,违背了“wri
35、teonce,onlyonce”的原则的原则为什么需要继承为什么需要继承4-3v如何改进?有没有可能建立继承关系,让子类自动继承父类的属性和方法?Java教员是教员吗?教员是教员吗?.NET教员是教员吗?教员是教员吗?publicclassAccpTeacherprivateStringname;/教员姓名教员姓名privateStringschool;/所在中心所在中心publicAccpTeacher(StringmyName,StringmySchool)name=myName;school=mySchool;publicvoidgiveLesson()System.out.printl
36、n(知识点讲解知识点讲解);System.out.println(总结提问总结提问);publicvoidintroduction()System.out.println(大家好!我是大家好!我是“+school+的的+name+。);现在,所有子类中相同的代码现在,所有子类中相同的代码都抽取到父类中了都抽取到父类中了属属性性行行为为姓名姓名所在中心所在中心授课授课自我介绍自我介绍教员教员Java教员教员.NET教员教员为什么需要继承为什么需要继承4-4publicclassAccpJavaTeacher2extendsAccpTeacherpublicAccpJavaTeacher2(Str
37、ingmyName,StringmySchool)super(myName,mySchool);publicvoidgiveLesson()System.out.println(启动启动 Eclipse);super.giveLesson();publicclassAccpDotNetTeacher2extendsAccpTeacherpublicAccpDotNetTeacher2(StringmyName,StringmySchool)super(myName,mySchool);publicvoidgiveLesson()System.out.println(启动启动VisualStud
38、io.NET);super.giveLesson();使用继承,可以有效实现代码复用使用继承,可以有效实现代码复用子类自动继承父类的属性子类自动继承父类的属性和方法,子类中不再存在和方法,子类中不再存在重复代码重复代码如何实现继承如何实现继承3-1v在Java语言中,用extends关键字来表示一个类继承了另一个类,例如:publicclassAccpJavaTeacher2extendsAccpTeacher/其余代码省略其余代码省略v在父类中只定义一些通用的属性与方法,例如:publicclassAccpTeacherprivateStringname;/教员姓名教员姓名privateSt
39、ringschool;/所在中心所在中心publicAccpTeacher(StringmyName,StringmySchool)/初始化属性值初始化属性值publicvoidgiveLesson()/授课方法的具体实现授课方法的具体实现publicvoidintroduction()/自我介绍方法的具体实现自我介绍方法的具体实现如何实现继承如何实现继承3-2v子类自动继承父类的属性和方法,子类中可以定义特定的属性和方法publicclassAccpTeacherprivateStringname;/教员姓名教员姓名privateStringschool;/所在中心所在中心publicAcc
40、pTeacher(StringmyName,StringmySchool)/初始化属性值初始化属性值publicvoidgiveLesson()/授课方法的具体实现授课方法的具体实现publicvoidintroduction()/自我介绍方法的具体实现自我介绍方法的具体实现publicclassAccpJavaTeacher2extendsAccpTeacherpublicAccpJavaTeacher2(StringmyName,StringmySchool)super(myName,mySchool);publicvoidgiveLesson()System.out.println(启动
41、启动Eclipse);super.giveLesson();由于由于giveLesson()方法与方法与父类的实现有所不同,因此父类的实现有所不同,因此重写了该方法重写了该方法方法重写:子类和父类的方法具有相同的名称、参数列表、返回类型方法重写:子类和父类的方法具有相同的名称、参数列表、返回类型父类中的属性和方法可父类中的属性和方法可以被子类继承以被子类继承publicclassAccpJavaTeacher2extendsAccpTeacherpublicAccpJavaTeacher2(StringmyName,StringmySchool)super(myName,mySchool);如
42、何实现继承如何实现继承3-3v子类的构造方法中,通过super关键字调用父类的构造方法方法重写后,通过super关键字调用父类的方法publicclassAccpJavaTeacher2extendsAccpTeacherpublicvoidgiveLesson()System.out.println(启动启动Eclipse);super.giveLesson();通过调用父类的构造方法,通过调用父类的构造方法,完成对属性值的初始化完成对属性值的初始化一切类的一切类的“祖先祖先”Objectv在Java 中,所有的Java类都直接或间接地继承了java.lang.Object类publiccl
43、assMyObject/publicclassMyObectextendsObject /在在Eclipse中调用中调用MyObject对象的成员,会自动弹出继对象的成员,会自动弹出继承自承自Object的所有方法的所有方法小结小结8v请编码实现动物世界的继承关系:动物(Animal)具有行为:吃(eat)、睡觉(sleep)动物包括:兔子(Rabbit),老虎(Tiger)这些动物吃的行为各不相同(兔子吃草,老虎吃肉);但睡觉的行为是一致的。v请通过继承实现以上需求,并编写测试类AnimalTest进行测试。为什么需要多态为什么需要多态5-1v在ACCP教员类的基础上,开发一个类代表总部,负
44、责对各教员进行评估,评估内容包括:1、教员的自我介绍 2、教员的授课为什么需要多态为什么需要多态5-2publicclassHQ1publicvoidjudge(AccpJavaTeacher2t)t.introduction();t.giveLesson();publicvoidjudge(AccpDotNetTeacher2t)t.introduction();t.giveLesson();publicstaticvoidmain(Stringargs)HQ1hq=newHQ1();hq.judge(newAccpJavaTeacher2(李明李明,北京中心北京中心“);hq.judge(
45、newAccpDotNetTeacher2(张明张明,天津中心天津中心“);v第一种解决方案大家好!我是北京中心的李明大家好!我是北京中心的李明.启动启动Eclipse知识点讲解知识点讲解总结提问总结提问大家好!我是天津中心的张明大家好!我是天津中心的张明.启动启动VisualStudio2005知识点讲解知识点讲解总结提问总结提问控制台控制台输出输出为什么需要多态为什么需要多态5-3v现在,升级ACCP教员类,增加一种新类型:AccpDBTeacher,该类型的教员专门负责教授数据库,要求如下:属性:姓名、所属中心方法:授课(启动Sql Server、实施理论课授课)、自我介绍v同时,总部也
46、负责对这类教员进行评估为什么需要多态为什么需要多态5-4v如果在第一种解决方案的基础上去解决,我们需要如下两个步骤:建立AccpDBTeacher类修改总部类,增加方法:judge(AccpDBTeacher t)每增加一种新的教员类型,都要修改总部类,增加相应的每增加一种新的教员类型,都要修改总部类,增加相应的judge(评估评估)方法,代码的可扩展性及可维护性极差方法,代码的可扩展性及可维护性极差能找到这个解决方案的弊端吗?能找到这个解决方案的弊端吗?为什么需要多态为什么需要多态5-5v第二种解决方案使用多态publicclassHQ3publicvoidjudge(AccpTeacher
47、t)t.introduction();t.giveLesson();publicstaticvoidmain(Stringargs)HQ3hq=newHQ3();hq.judge(newAccpJavaTeacher2(李明李明,北京中心北京中心“);hq.judge(newAccpDotNetTeacher2(张明张明,天津中心天津中心);hq.judge(newAccpDBTeacher(“李岚李岚,北京中心北京中心“);可以接收子类类型可以接收子类类型根据实际创建的对象根据实际创建的对象类型调用相应方法类型调用相应方法大家好!我是北京中心的李明大家好!我是北京中心的李明.启动启动Ecli
48、pse知识点讲解知识点讲解总结提问总结提问大家好!我是天津中心的张明大家好!我是天津中心的张明.启动启动VisualStudio2005知识点讲解知识点讲解总结提问总结提问大家好!我是北京中心的李岚大家好!我是北京中心的李岚.启动启动SqlServer知识点讲解知识点讲解总结提问总结提问控制台输出控制台输出使用多态之后,当需要增加新的子类类型时,无需更改总部类,程序的可扩展性及可维护性增强 什么是多态什么是多态简单来说,多态是具有表现多种形态的能力的特征 同一个实现接口,使用不同的实例而执行不同操作彩色打印机彩色打印机打印机打印机黑白打印机黑白打印机打印效果:彩色打印效果:彩色打印效果:黑白打
49、印效果:黑白打印打印打印打印publicclassAccpTeacherpublicvoidgiveLesson()System.out.println(知识点讲解知识点讲解);System.out.println(总结提问总结提问);publicclassTestpublicstaticvoidmain(Stringargs)HQ3hq=newHQ3();hq.judge(newAccpDBTeacher();3如何实现多态如何实现多态1、子类重写父类的方法、子类重写父类的方法2、编写方法时,使用父类定义的方法、编写方法时,使用父类定义的方法3、运行时,根据实际创建的对象类型动态决定使用哪个
50、方法、运行时,根据实际创建的对象类型动态决定使用哪个方法publicclassAccpDBTeacherextendsAccpTeacherpublicvoidgiveLesson()System.out.println(启动启动SqlServer);super.giveLesson();1publicclassHQ3publicvoidjudge(AccpTeachert)t.giveLesson();2小结小结9v请编码实现如下需求:乐器(Instrument)分为:钢琴(Piano)、小提琴(Violin)各种乐器的弹奏(play)方法各不相同。v编写一个测试类InstrumentTes