章面向对象下_第1页
章面向对象下_第2页
章面向对象下_第3页
章面向对象下_第4页
章面向对象下_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

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

文档简介

第四章面向对象(下)主讲老师:游学军教学目标理解继承性的概念,特别要理解子类对象产生过程。理解方法覆盖的概念。掌握Java编程去实现继承性。理解多态性的概念。掌握Java编程去实现多态性。理解抽象类及抽象方法的概念及其Java实现。理解接口的概念及其Java的实现。理解面向接口编程的思想及Java的实现。理解使用继承性增加程序代码的复用性。理解使用面向接口编程的方法增加了程序的可维护性和可扩展性。生活中的继承巴士是汽车吗?卡车是汽车吗?出租车是汽车吗?最大载客数量报站引擎数量外观颜色刹车加速汽车最大载重量卸货所属公司最大载客数量打发票属性行为请问:出租车包含哪些属性和行为呢?类的继承继承的特点具有层次结构,子类继承了父类的属性和方法。继承的优点:提高代码的重用率,可以简化类的定义。Java只支持单继承,不允许多重继承。可以有多层继承,即一个类可以继承某一个类的子类,如类B继承了类A,类C又可以继承类B,那么类C也间接继承了类A。子类继承父类所有的非私有成员变量和成员方法,但不继承父类的构造方法。子类对象的实例化过程示例演示讲解:父类Person,子类Student当调用子类构造方法创建子类对象时,首先调用父类构造函数,直至Object类为止,然后执行子类的构造函数。如果子类的构造方法中没有显式地调用父类构造方法,也没有使用this关键字调用重载的其它构造方法,则在产生子类的实例对象时,系统默认调用父类无参数的构造方法。若父类没有定义构造函数,那么对父类数据的初始化将采用系统缺省的构造函数;此时不会产生错误。若父类定义有缺省构造函数,也定义类有参数的构造函数,那么子类可根据自己的需要设置自己的构造函数。若父类定义的构造函数都是有参的,那么子类构造函数必须通过super调用父类构造函数。覆盖(重写)父类的方法方法的覆盖发生在父类和子类之间,若子类中定义的某个方法的特征,与父类中定义的某个方法的特征完全一样,那么就说子类中的这个方法覆盖了父类对应的那个方法。覆盖方法时,不能使用比父类中被覆盖的方法更严格的访问权限。如果在子类中想调用父类中的那个被覆盖的方法,可以用super.方法的格式。覆盖方法与重载方法的区别联系示例演示讲解:Point、Circle、Cylinder编程练习一

开发教师类,其中教师分为Java教师以及.NET教师,各自的要求如下:Java教师属性:姓名、所属教研室方法:授课giveLession(步骤:打开Eclipse、知识点讲解,总结提问)、自我介绍introduce.NET教师属性:姓名、所属教研室方法:授课(步骤:打开Visualstudio2005、知识点讲解,总结提问)、自我介绍编程练习二请编码实现动物世界的继承关系:动物(Animal)具有行为:吃(eat)、睡觉(sleep)动物包括:兔子(Rabbit),老虎(Tiger)这些动物吃的行为各不相同(兔子吃草,老虎吃肉);但睡觉的行为是一致的。请通过继承实现以上需求,并编写测试类AnimalTest进行测试。面向对象的多态性情况1:在教师类的基础上,开发一个类代表督导部门,负责对各教师进行评估judge,评估内容包括教师的自我介绍教师的授课情况2:升级教师类,增加一种新类型:DBTeacher,该类型的教师专门负责教授数据库,要求如下:属性:姓名、所属教研室方法:授课(启动SqlServer、知识点讲解、总结提问)、自我介绍同时,督导部门也负责对这类教师进行评估此时程序的实现可以发现,可扩展性和可维护性差。如何解决呢?多态性面向对象的多态性同一个实现接口,使用不同的实例而执行不同的操作。通过方法重载和方法覆盖实现多态性。父类的变量可以引用子类的对象,此为多态性的表现。多态性必须依赖继承性。使用多态性即父类引用变量调用的是子类中被覆盖的那个方法。不能调用子类本身的非覆盖方法。子类的对象可以被父类的引用变量引用,这叫向后兼容,可以提高程序的可扩充性和可维护性。以前写的程序可以被后来程序调用不足为奇,现在写的程序能调用以后写的程序就了不起了。应用程序不必为每一个子类编写功能调用,只需要对父类进行处理即可。这一招叫“以不变应万变”,可以大大提高程序的可扩展性和可维护性。编程练习三请编码实现如下需求:乐器(Instrument)分为:钢琴(Piano)、小提琴(Violin)各种乐器的弹奏(play)方法各不相同。编写一个测试类InstrumentTest,要求:编写方法testPlay,对各种乐器进行弹奏测试。要依据乐器的不同,进行相应的弹奏。在main方法中进行测试抽象类 Java中可以定义一些不含方法体的方法,它的方法体的实现交给该类的子类根据自己的情况去实现,这样的方法就是抽象方法,包含抽象方法的类就叫抽象类。抽象类必须用abstract关键字来修饰;抽象方法也必须用abstract来修饰。抽象类不能被实例化,也就是不能用new关键字去产生对象。但是可以有构造函数,此构造函数供子类调用。抽象方法只需声明,而不需实现。含有抽象方法的类必须被声明为抽象类,抽象类的子类必须覆盖所有的抽象方法后才能被实例化,否则这个子类还是个抽象类。可以使用多态性,即抽象类变量可以引用其子类对象。编程练习四

利用多态性编程,实现求三角形、正方形和圆形面积。方法:抽象出一个共享父类,定义一函数为求面积的公共界面,再重新定义各形状的求面积函数。在主类中创建不同类的对象,并求得不同形状的面积。final关键字声明类、属性和方法时,可使用关键字final来修饰:final标记的类不能被继承。final标记的方法不能被子类重写。final标记的变量(成员变量或局部变量或引用变量)即成为常量,只能赋值一次。修饰静态变量:必须在静态初始化块中或声明时指定初始值修饰实例变量:必须在非静态初始化块或声明该实例变量或构造器中指定初始值与普通成员不同的是,final修饰的变量不会进行隐式初始。使用常量可以增加程序的可维护性。常量通常定义为publicstaticfinal,这个常量就成了全局的常量。final关键字方法中定义的内置类只能访问该方法内的final类型的局部变量,用final定义的局部变量相当于是一个常量,它的生命周期超出方法运行的生命周期,将一个形参定义成final也是可以的,这就限定了我们在方法中修改形式参数的值。不可变类,即不可变类的实例在整个生命周期中永远处于初始化状态。电脑主板上的PCI插槽的规范就类似于Java接口声卡显卡网卡每种卡的内部结构都不相同,可以把声卡、网卡、显卡都插在PCI插槽上,而不用担心哪个插槽是专门插哪个卡的主板生活中的接口什么是Java接口一个Java接口是一些方法特征的集合,但没有方法的实现publicinterfacePCI{

publicvoidstart();

publicvoidstop();

}classSoundCardimplementsPCI{publicvoidstart()

{

System.out.println("Dudu...");

}

publicvoidstop()

{

System.out.println("Soundstop!");

}

}Java接口中定义的方法在不同的地方被实现,可以具有完全不同的行为这是Java接口,相当于主板上的PCI插槽的规范classNetworkCardimplementsPCI{publicvoidstart()

{

System.out.println("Send...");

}

publicvoidstop()

{

System.out.println("Networkstop!");

}

}声卡、网卡都实现了PCI插槽的规范,但行为完全不同什么是Java接口publicclassAssembler{

publicstaticvoidmain(String[]args){

PCInc=newNetworkCard();

PCIsc=newSoundCard();

nc.start();sc.start();

}

}可以使用Java接口标识类型运行时,根据实际创建的对象类型调用相应的方法实现Dudu...Send...控制台输出21接口(interface)接口中的成员都是public访问类型的。接口里的变量默认是用publicstaticfinal标识的我们可以定义一个新的接口用extends关键字去继承一个已有的接口,而且可以多重继承我们也可以定义一个类用implements关键字去实现一个接口中的所有方法,我们还可以去定义一个抽象类用implements关键字去实现一个接口中定义的部分方法一个类可以继承一个父类的同时,实现一个或多个接口,extends关键字必须位于implemnets关键字之前接口中没有构造方法接口也适用于多态性接口(interface)如果一个抽象类中的所有方法都是抽象的,可以将这个类用另外一种方式来定义,也就是接口定义。接口是抽象方法和常量值的定义的集合,从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现。引入接口的原因:在程序设计中经常遇到这样一个问题:有些类互不相关,但却具有相似的方法。并且这些方法在各个类中的实现互不相同。我们不能为这些类定义一个共同的父类,但又希望在程序中体现出它们共同的接口。为什么需要Java接口为各个办公室开发这样一个小系统,包含类型:教师、办公室、打印机,具体要求如下:教师、以及办公室都具有方法:输出详细信息办公室具有属性:打印机,能够通过办公室的打印机打印教师或办公室的详细信息系统要具备良好的可扩展性与可维护性打印教师办公室教师

详细信息办公室

详细信息detail方法(输出详细信息)为什么需要Java接口以下这个解决方案中存在着什么问题?publicclassTeacher{//输出教员的详细信息publicStringdetail(){ return“本人是xxx教师";}}publicclassOffice{privatePrinterprinter=newPrinter();//输出办公室的详细信息publicStringdetail(){return“这里是Office办公室";}//使用打印机打印教师信息publicvoidprint(Teachert){printer.print(t.detail());}//使用打印机打印中心信息publicvoidprint(Offices){ printer.print(s.detail());}}publicclassPrinter{publicvoidprint(Stringcontent){System.out.println("开始打印:");System.out.println(content);}}每增加一种新类型,都需要增加相应的print(类型名称var)方法——程序的可扩展性及可维护性极差——这不符合系统的要求为什么需要Java接口在这个系统中,存在继承关系吗?教员、中心属于两种不同的类型,无法通过“is-a”找到一个合适的父类教员、中心都存在一个共同的方法特征:detail,它们对detail方法有各自不同的实现——这完全符合Java接口的定义定义一个Java接口,在其中定义detail方法,但没有具体实现实现这个Java接口,不同的类对detail方法有不同的具体实现IntroduceableTeacher(教员)Office(中心)为什么需要Java接口publicinterfaceIntroduceable{publicStringdetail();}publicclassOffice

implementsIntroduceable{privatePrinterprinter=newPrinter();publicStringdetail(){return“这里是xxx办公室";}publicvoidprint(Introduceableintro){ printer.print(intro.detail());}}publicclassTeacher

implementsIntroduceable{publicStringdetail(){ return“本人是xxx教师";}}通过Java接口,我们同样可以享受到多态性的好处,大大提高了程序的可扩展性及可维护性使用print方法时,参数可以是任何Introduceable接口的实现类的对象,不必再为不同的类型建立不同的print方法了使用了Java接口之后,这个系统有了怎样的改进?编程练习五为刚才完成的系统增加一种新的类型:学生(Student),具体要求如下:学生具有detail方法,负责输出学生详细信息能够通过办公室的打印机打印学生的详细信息系统要具备良好的可扩展性与可维护性编写测试类StudentTest进行测试,要求:通过办公室的打印机打印学生的详细信息什么是面向接口编程开发系统时,主体构架使用接口,接口构成系统的骨架这样就可以通过更换接口的实现类来更换系统的实现publicclassOfficeimplementsIntroduceable{privatePrinterprinter=newPrinter();publicStringdetail(){return“这里是XXX教研室";}//使用打印机打印信息publicvoidprint(Introduceableintro){ printer.print(intro.detail());}}IntroduceableTeacher(教师)Office(教研室)面向接口编程的示例升级上述的系统,要求:打印机有多种类型,比如:黑白打印机、彩色打印机等中心可能配备其中任意一款打印机,负责打印教员、或者办公室的详细信息系统要具备良好的可扩展性与可维护性print方法(打印)彩色打印机黑白打印机黑白内容办公室/教员详细信息彩色内容面向接口编程的示例采用面向接口编程的方式实现,以下是三个步骤中的第一步:抽象出Java接口1、分析:黑白、彩色打印机都存在一个共同的方法特征:print黑白、彩色打印机对print方法有各自不同的实现2、结论:抽象出Java接口PrinterFace,在其中定义方法print3、具体实现:publicinterfacePrinterFace{publicvoid

print(Stringcontent);}面向接口编程的示例采用面向接口编程的方式实现,以下是三个步骤中的第二步:publicclassColorPrinter

implementsPrinterFace{publicvoid

print(Stringcontent){System.out.println("彩色打印:");System.out.println(content);}}publicclassBlackPrinter

implementsPrinterFace{publicvoid

print(Stringcontent){System.out.println("黑白打印:");System.out.println(content);}}实现Java接口1、分析:已经抽象出Java接口PrinterFace,并在其中定义了print方法黑白、彩色打印机对print方法有各自不同的实现2、结论:黑白、彩色打印机都实现PrinterFace接口,各自实现print方法3、具体实现:面向接口编程的示例采用面向接口编程的方式实现,以下是三个步骤中的第三步:使用Java接口1、分析:主体构架使用接口,让接口构成系统的骨架2、结论:更换实现接口的类就可以更换系统的实现3、具体实现:publicclassOfficeimplementsIntroduceable{privatePrinterFaceprinter;//打印机

publicvoidsetPrinter(PrinterFacep){this.printer=p;}publicStringdetail(){return“这里是xxx办公室";}publicvoidprint(Introduceableintro){

printer.print(intro.detail());}}publicclassAccpTest{publicstaticvoidmain(String[]args){//创建中心实例Officeoffice=newOffice();//为该中心配备黑白打印机

office.setPrinter(newBlackPrinter());office.print(office);//为该中心配备彩色打印机

office.setPrinter(new

ColorPrinter());office.print(office);}}OO思想总结OO基本特征定义具体实现方式优势封装隐藏实现细节,对外提供公共的访问接口属性私有化、添加公有的setter、getter方法增强代码的可维护性继承从一个已有的类派生出新的类,子类具有父类的一般特性,以及自身特殊的特性继承需要符合的关系:is-a1、实现抽象(抽出像的部分)2、增强代码的可复用性多态同一个实现接口,使用不同的实例而执行不同操作通过Java接口/继承来定义统一的实现接口;通过方法重写为不同的实现类/子类定义不同的操作增强代码的可扩展性、可维护性对象的类型转换子类对象变量可以自动转换成父类变量父类转换成子类必须使用强制转换,强制类型转换的前提是父类引用类型对象确实是子类类型的.instanceof操作符可以用它来判断一个实例对象是否属于一个类或实现接口的子类。Object类及equals,hashCode,toString,clone方法包

package语句及应用package语句作为Java源文件的第一条语句。如果没有package语句,则为缺省无名包。import语句及应用import<包路径>.<类>|.*;有名包中的类不能引入无名包中的类jdk中常用的包java.lang----包含一些Java语言的核心类,如String、Math、Integer、System和Thread,提供常用功能。java.awt----包含了构成抽象窗口工具集(abstractwindowtoolkits)的多个类,这些类被用来构建和管理应用程序的图形用户界面(GUI)。javax.swing---Java的扩展包,其中包含GUI所需要的控件类。比AWT提供更丰富的控件类。java.util----包含一些实用工具类,如定义系统特性、使用与日期日历相关的函数。java.io----包含能提供多种输入/输出功能的类。

----包含执行与网络相关的操作的类。java.applet----包含applet运行所需的一些类。java.sql---包含JDBC编程需要使用的接口及类。包

访问控制

类本身也有访问控制,即在定义类的class关键字前加上访问控制符,但类本身只有两种访问控制,即public和默认,父类不能是private和protected,否则子类无法继承。public修饰的类能被所有的类访问,默认修饰(即class关键字前没有访问控制符)的类,只能被同一包中的所有类访问。

匿名内部类abstractclassA{ abstractpublicvoidfun1();}classOuter{publicstaticvoidmain(String[]args){newOuter().callInner(newA(){ publicvoidfun1() { System.out.println("implementforfun1"); }});}publicvoidcallInner(Aa){ a.fun1();}}匿名内部类外部类可以声明是抽象类或是一个接口,它可以被另外一个内部类来继承或实现。内部类可以继承外部类,也可以用final关键字修饰。newA(){}:表示产生一个类A的匿名子类的实例对象。匿名子类的所有实现代码都要在这对大括号内增加。异常

异常定义了程序中遇到的非致命的错误,而不是编译时的语法错误,如程序要打开一个不存的文件、网络连接中断、操作数越界、装载一个不存在的类等。try,catch语句throws关键字自定义异常与throw关键字如何对多个异常作出处理我们可以在一个方法中使用throw,try…catch语句来实现程序的跳转一个方法被覆盖时,覆盖它的方法必须扔出相同的异常或异常的子类。如果父类扔出多个异常,那么重写(覆盖)方法必须扔出那些异常

温馨提示

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

评论

0/150

提交评论