第五章面向对象程序设计与开发(一)_第1页
第五章面向对象程序设计与开发(一)_第2页
第五章面向对象程序设计与开发(一)_第3页
第五章面向对象程序设计与开发(一)_第4页
第五章面向对象程序设计与开发(一)_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第五章

面向对象程序设计与开发(一)本章目标理解封装掌握构造方法掌握继承掌握super关键字理解多态为什么需要封装编写一个类,代表教员,要求:具有属性:姓名、年龄具有行为:自我介绍教员的最小年龄要求:24岁

publicclassTeacher1{publicStringname;//教员姓名publicintage;//年龄/***返回自我介绍的内容*/publicStringintroduction(){return"大家好!我是"+name+",我今年"+age+"岁";}}为什么需要封装编写一个测试类,要求:实例化一个教员对象,并对其初始化在控制台输出该教员的自我介绍publicclassTeacher1Test{publicstaticvoidmain(String[]args){Teacher1teacher=newTeacher1();="李芳";teacher.age=10;System.out.println(roduction());}}要满足教员的最小年龄要求,可以通过对属性的封装来实现大家好!我是李芳,我今年10岁什么是封装publicclassTeacher2{privateStringname;//教员姓名//返回教员姓名publicStringgetName(){

returnname;}//设定教员姓名publicvoidsetName(Stringname){

=name;}}

封装,就是隐藏实现细节将属性私有化,提供公有方法访问私有属性通过这些公有方法访问私有属性Teacher2teacher=newTeacher2();teacher.setName("李芳");StringtName=teacher.getName();通过setter、getter方法访问name属性this代表当前类的实例如何实现封装封装的实现:1、修改属性的可见性来限制对属性的访问2、为每个属性创建一对赋值(setter)方法和取值(getter)方法,用于对这些属性的访问3、在setter和getter方法中,加入对属性的存取限制publicclassTeacher3{privateStringname;//教员姓名privateintage;//年龄publicintgetAge(){ returnage;}publicvoidsetAge(intage){if(age<22){System.out.println("错误!最小年龄应为22岁!");this.age=22;//如果不符合年龄要求,则赋予默认值}else{this.age=age;}}//此处省略对name属性的setter、getter方法}123为什么需要构造方法教员类Teacher4,要求:具有属性:姓名、年龄、学历、职位具有行为:自我介绍publicclassTeacher4{privateStringname;//姓名privateintage;//年龄privateStringeducation;//学历privateStringposition;//职位publicStringintroduction(){return"大家好!我是"+name+",我今年"+age+"岁,学历"

+education+",目前职位是"+position;}publicStringgetName(){ returnname;}publicvoidsetName(StringmyName){ name=myName;}//以下是其他属性的setter、getter方法,此处省略}为什么需要构造方法编写一个测试类,要求:实例化一个教员对象,并对其初始化在控制台输出该教员的自我介绍publicclassTeacher4Test{publicstaticvoidmain(String[]args){Teacher4teacher=newTeacher4();teacher.setName("李芳");teacher.setAge(23);teacher.setEducation("本科");System.out.println(roduction());}}要简化对象初始化的代码,可以通过构造方法来解决大家好!我是李芳,我今年25岁,学历本科,目前职位是nullTeacher4中有太多的属性及对应的setter方法,在初始化时,很容易就忘记了,有没有可能简化对象初始化的代码?什么是构造方法构造方法负责对象成员的初始化工作,为实例变量赋予合适的初始值构造方法必须满足以下语法规则:

1、构造方法是一个特殊的方法2、方法名与类名相同3、没有返回类型publicclassTeacher5{privateStringname;//教员姓名//构造方法publicTeacher5(){name="无名氏";}}publicclassTeacher5Test{publicstaticvoidmain(String[]args){ Teacher5teacher=newTeacher5();}}使用new关键字调用构造方法调用构造方法当一个类中没有显示的定义构造方法时,类中存在一个默认的无参的构造方法publicTeacher5(){}带参数的构造方法通过带参数的构造方法,显式地为实例变量赋予初始值publicclassTeacher6{privateStringname;//教员姓名privateintage;//年龄privateStringeducation;//学历privateStringposition;//职位//带参数的构造方法publicTeacher6(StringpName,intpAge, StringpEducation,StringpPosition){name=pName;age=pAge;//可以增加对age等属性的存取限制条件education=pEducation;position=pPosition;}publicStringintroduction(){return"大家好!我是"+name+",我今年"+age+"岁,学历"+education+",目前职位是"+position;}}带参数的构造方法通过调用带参数的构造方法,简化对象初始化的代码publicclassTeacher6Test{publicstaticvoidmain(String[]args){Teacher6teacher=newTeacher6("李芳",23,"本科","咨询师");System.out.println(roduction());}}创建对象时,一并完成了对象成员的初始化工作大家好!我是李芳,我今年23岁,学历本科,目前职位是咨询师当在类中显示的定义了构造方法后默认的无参数的构造方法自动消失生活中的方法重载类方法方法参数方法实现司机轿车巴士火车驾驶启动、行驶、……等待乘客上车、启动、行驶、到站停车、……正点发车、行驶、到站停车、……如果用代码实现,我们需要三个方法,这些方法的方法名称相同,参数类型不同方法重载的代码示例方法重载并不陌生java.io.PrintStream类的println方法能够打印数据并换行,根据数据类型的不同,有多种实现方式publicclassTest{publicstaticvoidmain(String[]args){inti=0;charc='z';Stringstr="hello";System.out.println(i);System.out.println(c);System.out.println(str);}}PrintStreamprintln(int)println(char)println(String)……方法名相同,参数类型不同调用不同的println方法方法重载方法重载的代码示例java.lang.Math类的max()方法能够从两个数字中取出最大值,它有多种实现方式运行时,Java虚拟机先判断给定参数的类型,然后决定到底执行哪个max()方法Mathmax(inta,intb)max(floata,floatb)max(longa,longb)max(doublea,doubleb)publicclassTest{publicstaticvoidmain(String[]args){Math.max(1,2);Math.max(1.0F,2.0F);Math.max(1.0,2);}}方法重载构造方法重载构造方法重载是方法重载的典型示例publicclassTeacher7{privateStringname;//教员姓名privateStringschool=“西安加中”;//所在学校publicTeacher7(Stringname){ =name;//设定教员姓名}publicTeacher7(Stringname,Stringschool){=name;//设定教员姓名this.school=school;//设定教员的所在学校}publicStringintroduction(){ return"大家好!我是"+school+"的"+name;}}构造方法重载构造方法重载通过调用不同的构造方法来表达对象的多种初始化行为例如:默认情况下,教师来自西安,初始化时,只需提供教员姓名有时,需要提供所在学校名称及教员姓名publicclassTeacher7Test{publicstaticvoidmain(String[]args){ Teacher7teacher1=newTeacher7("李芳");System.out.println(roduction());Teacher7teacher2=newTeacher7("张欣",

“成都加中");System.out.println(roduction());}}大家好!我是西安加中的李芳大家好!我是成都加中的张欣给定如下Java代码,请指出代码中的错误,并解释原因publicclassSample{privateintx;publicSample(){ x=1;}publicSample(inti){ x=i;}publicintSample(inti){x=i;returnx++;}privateSample(inti,Strings){}publicSample(Strings,inti){}privateSampla(inti){ x=i++;}privatevoidSampla(inti){ x=i++;}}小结无参构造方法带参构造方法不是构造方法带参构造方法带参构造方法名称与类名不相同不是构造方法生活中的继承生活中,继承的例子随处可见动物食草动物食肉动物谁是父类?谁是子类?能说出继承的特点吗?继承需要符合的关系:is-a,父类更通用、子类更具体生活中的继承子类具有父类的一般特性(包括属性和行为),以及自身特殊的特性巴士是汽车吗?卡车是汽车吗?出租车是汽车吗?最大载客数量报站引擎数量外观颜色刹车加速汽车最大载重量卸货所属公司最大载客数量打发票属性行为请问:出租车包含哪些属性和行为呢?为什么需要继承开发教员类,其中教员分为Java教员以及.NET教员,各自的要求如下:Java教员属性:姓名、所属学校方法:授课(步骤:打开Eclipse、实施理论课授课)、自我介绍.NET教员属性:姓名、所属学校方法:授课(步骤:打开Visualstudio2005、实施理论课授课)、自我介绍请问:以下这个解决方案中存在着什么问题?为什么需要继承publicclassDotNetTeacher{privateStringname;//教员姓名privateStringschool;//所在学校publicAccpDotNetTeacher(StringmyName,StringmySchool){name=myName;school=mySchool;}publicvoidgiveLession(){System.out.println("启动

VisualStudio2005");System.out.println("知识点讲解");System.out.println("总结提问");}publicvoidintroduction(){ System.out.println("大家好!我是" +school+"的"+name+".");}}publicclassJavaTeacher{privateStringname;//教员姓名privateStringschool;//所在学校publicAccpJavaTeacher(StringmyName,StringmySchool){name=myName;school=mySchool;}publicvoidgiveLession(){System.out.println("启动

Eclipse");System.out.println("知识点讲解");System.out.println("总结提问");}publicvoidintroduction(){ System.out.println("大家好!我是" +school+"的"+name+".");}}代码存在重复,违背了“writeonce,onlyonce”的原则为什么需要继承如何改进?有没有可能建立继承关系,让子类自动继承父类的属性和方法?Java教员是教员吗?.NET教员是教员吗?publicclassTeacher{privateStringname;//教员姓名privateStringschool;//所在学校publicAccpTeacher(StringmyName,StringmySchool){name=myName;school=mySchool;}publicvoidgiveLesson(){System.out.println("知识点讲解");System.out.println("总结提问");}publicvoidintroduction(){ System.out.println("大家好!我是“

+school+"的"+name+"。");}}现在,所有子类中相同的代码都抽取到父类中了属

性行

为姓名所在学校授课自我介绍教员Java教员.NET教员为什么需要继承publicclassJavaTeacher2extendsTeacher{publicJavaTeacher2(StringmyName,StringmySchool){super(myName,mySchool);}publicvoidgiveLesson(){System.out.println("启动Eclipse");super.giveLesson();}}publicclassDotNetTeacher2extendsTeacher{publicDotNetTeacher2(StringmyName,StringmySchool){super(myName,mySchool);}publicvoidgiveLesson(){System.out.println("启动VisualStudio.NET");super.giveLesson();}}使用继承,可以有效实现代码复用子类自动继承父类的属性和方法,子类中不再存在重复代码继承的特点继承的特点具有层次结构子类继承了父类的属性和方法继承的优点继承的优点代码的可重用性父类的属性和方法可用于子类设计应用程序变得更加简单可以轻松地自定义子类如何实现继承在Java语言中,用extends关键字来表示一个类继承了另一个类,例如:publicclassJavaTeacher2extendsTeacher{//其余代码省略}在父类中只定义一些通用的属性与方法,例如:publicclassTeacher{privateStringname;//教员姓名privateStringschool;//所在中心publicTeacher(StringmyName,StringmySchool){//初始化属性值}publicvoidgiveLesson(){//授课方法的具体实现}publicvoidintroduction(){//自我介绍方法的具体实现

}}如何实现继承子类自动继承父类的属性和方法,子类中可以定义特定的属性和方法publicclassTeacher{privateStringname;//教员姓名privateStringschool;//所在中心publicTeacher(StringmyName,StringmySchool){//初始化属性值}publicvoidgiveLesson(){ //授课方法的具体实现}publicvoidintroduction(){ //自我介绍方法的具体实现

}}publicclassJavaTeacher2extendsAccpTeacher{publicJavaTeacher2(StringmyName,StringmySchool){super(myName,mySchool);}publicvoidgiveLesson(){System.out.println("启动Eclipse");super.giveLesson();}}由于giveLesson()方法与父类的实现有所不同,因此重写了该方法方法重写:子类和父类的方法具有相同的名称、参数列表、返回类型和访问修饰符父类中的属性和方法可以被子类继承publicclassJavaTeacher2extendsTeacher{publicJavaTeacher2(StringmyName,StringmySchool){super(myName,mySchool);}}如何实现继承子类的构造方法中,通过super关键字调用父类的构造方法方法重写后,通过super关键字调用父类的方法publicclassJavaTeacher2extendsTeacher{publicvoidgiveLesson(){System.out.println("启动Eclipse");super.giveLesson();}}通过调用父类的构造方法,完成对属性值的初始化一切类的“祖先”——Object在Java中,所有的Java类都直接或间接地继承了java.lang.Object类publicclassMyObject{//…}publicclassMyObectextendsObject{

//…}在Eclipse中调用MyObject对象的成员,会自动弹出继承自Object的所有方法小结请编码实现动物世界的继承关系:动物(Animal)具有行为:吃(eat)、睡觉(sleep)动物包括:兔子(Rabbit),老虎(Tiger)这些动物吃的行为各不相同(兔子吃草,老虎吃肉);但睡觉的行为是一致的请通过继承实现以上需求,并编写测试类AnimalTest进行测试完整代码实现为什么需要多态在教员类的基础上,开发一个类代表总部,负责对各教员进行评估,评估内容包括:

1、教员的自我介绍

2、教员的授课为什么需要多态publicclassHQ1{publicvoidjudge(JavaTeacher2t){roduction();t.giveLesson();}publicvoidjudge(DotNetTeacher2t){roduction();t.giveLesson();}publicstaticvoidmain(String[]args){HQ1hq=newHQ1();hq.judge(newJavaTeacher2(“李明”,“西安加中“));hq.judge(newDotNetTeacher2(“张明”,“无锡加中“));}}第一种解决方案大家好!我是西安加中的李明.启动Eclipse知识点讲解总结提问大家好!我是无锡加中的张明.启动VisualStudio2005知识点讲解总结提问控制台输出为什么需要多态现在,升级教员类,增加一种新类型:DBTeacher,该类型的教员专门负责教授数据库,要求如下:属性:姓名、所属学校方法:授课(启动SqlServer、实施理论课授课)、自我介绍同时,总部也负责对这类教员进行评估为什么需要多态如果在第一种解决方案的基础上去解决,我们需要如下两个步骤:建立DBTeacher类修改总部类,增加方法:judge(DBTeachert)每增加一种新的教员类型,都要修改总部类,增加相应的judge(评估)方法,代码的可扩展性及可维护性极差能找到这个解决方案的弊端吗?完整代码实现总部类完整代码实现为什么需要多态第二种解决方案——使用多态publicclassHQ3{publicvoidjudge(Teachert){roduction();t.giveLesson();}publicstaticvoidmain(String[]args){HQ3hq=newHQ3();hq.judge(newJavaTeacher2("李明","北京中心“)); hq.judge(newDotNetTeacher2("张明","天津中心")); hq.judge(newDBTeacher(“李岚","北京中心“));}}可以接收子类类型根据实际创建的对象类型调用相应方法大家好!我是北京中心的李明.启动Eclipse知识点讲解总结提问大家好!我是天津中心的张明.启动VisualStudio2005知识点讲解总结提问大家好!我是北京中心的李岚.启动SqlServer知识点讲解总结提问控制台输出使用多态之后,当需要增加新的子类类型时,无需更改总部类,程序的可扩展性及可维护性增强什么是多态简单来说,多态是具有表现多种形态的能力的特征同一个实现接口,使用不同的实例而执行不同操作彩色打印机打印机黑白打印机打印效果:彩色打印效果:黑白打印打印publicclassTeacher{publicvoidgiveLesson(){

System.out.println("知识点讲解");System.out.println("总结提问");

}}publicclassTest{publicstaticvoidmain(String[]args){

HQ3hq=newHQ3();hq.judge(newDBTeacher());}}3如何实现多态1、子类重写父类的方法2、编写方法时,调用父类定义的方法3、运行时,根据实际创建的对象类型动态决定使用哪个方法publicclassDBTeacherextendsAccpTeacher{publicvoidgiveLesson(){

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论