第9章Java继承多态与接口

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第9章Java继承、多态与接口本章学习重点:继承与多态的概念继承与多态的实现机制抽象类和接口9.1继承与多态当一个类拥有另一个类的数据和操作时,就称这两个类之间具有继承关系,被继承的类称为父类或超类,继承的类称为子类。一个父类可以同时拥有多个子类,该父类实际上是所有子类的公共成员变量和公共方法的集合,而子类是父类的特殊化,可对公共成员变量和方法在功能、内涵方面加以扩展和延伸。面向对象的继承特性中,还有一个关于单继承和多继承的概念。–单继承是指任何类都只有一个父类。–多继承是指一个类可以有一个以上的父类,它静态数据和操作从所有这些父类中继承的。Java只支持单重继承,但支持界面,一个类可以实现多个界面。利用界面可以得到多继承的优点,又没有多继承混乱、复杂的问题。Java继承:创建子类Java中的继承是通过extends关键字来实现的。格式为:class子类名extends父类名称{……}在定义类时用extends关键字指明新定义类的父类,就在两个类之间建立了继承关系,新定义的类被称为子类。–如果子类和父类在同一个包中,它可以从父类那里继承所有非private的成员变量和方法作为自己的成员。–如果子类和父类不在同一个包中,它可以从父类那里继承protected、public的的成员变量和方法作为自己的成员.【例】应用继承性的实例。classStudent{//自定义“学生”类intstu_id;//定义属性:学生学号voidset_id(intid){//定义方法:设置学号stu_id=id;}voidshow_id(){//定义方法:显示学号System.out.println(thestudentIDis:+stu_id);}}classUniversityStudentextendsStudent{//定义子类intdep_number;//定义子类特有的属性变量voidset_dep(intdep_num){//定义子类特有的方法dep_number=dep_num;}voidshow_dep(){System.out.println(thedep_numberis:+dep_number);}publicstaticvoidmain(Stringargs[]){UniversityStudentLee=newUniversityStudent();Lee.set_id(2007070130);//继承父类学生的属性Lee.set_dep(701);//使用本类的属性Lee.show_id();//继承父类学生的方法Lee.show_dep();//使用本类的方法}}成员变量的隐藏和方法的覆盖1.成员变量的继承–子类可以继承父类的所有非私有成员变量。2.成员变量的继承–子类重新定义一个从父类那里继承来的成员变量变量完全相同的变量,称为成员变量的隐藏。3.方法的覆盖–方法的覆盖是指子类重定义从父类继承来的一个同名方法,此时子类将清除父类方法的影响。–注意:子类在重新定义父类已有的方法时,应保持与父类完全相同的方法头声明,即应与父类有完全相同的方法名、相同的参数表和相同的返回类型。【例】成员变量的隐藏和方法的覆盖示例。classSuperClass{intx;……voidsetX(){x=0;}……}classSubClassextendsSuperClass{intx;//成员变量的隐藏……voidsetX(){//方法的覆盖x=5;}……}方法的覆盖与成员变量的隐藏的区别为:–子类隐藏父类的成员变量只是使之不可见,父类的同名成员变量在子类对象中仍然占有自己独立的内存空间;–而子类方法对父类同名方法的覆盖将清除父类方法占用的内存,从而使父类方法在子类对象中不存在。方法的覆盖与成员变量的隐藏的意义:将父类行为和状态改为自身的行为和状态,对外仍保持统一的接口和名字,不失继承性。super子类对父类的同名成员变量和方法,分别实行隐藏和覆盖。但是,有时需要在子类中访问父类的变量、父类的方法,Java提供的super就可以实现这访问。它的使用有三种情况:–访问被隐藏的父类成员变量,如:super.VariableName–调用父类中被覆盖的方法,如:super.MethodName–调用父类中的构造方法,如:super([paramList])多态性多态性是面向对象程序设计的又一特征。–面向过程的语言编程的主要工作是编写一系列过程或函数,这些过程和函数各自对应一定的功能,它们之间不能重名,否则在调用时,就会产生歧异和错误。–而在面向对象的程序设计中,有时却需要利用这样的“重名”现象来提高程序的抽象度和简洁性。多态性是指同名的不同方法在程序中共存。–即为同一个方法定义几个版本,运行时根据不同情况执行不同的版本。调用者只需使用同一个方法名,系统会根据不同情况,调用相应的不同方法,从而实现不同的功能。在Java语言中,多态性的实现有两种方式:–1、覆盖实现多态性–2、重载实现多态性1、覆盖实现多态性覆盖实现多态性–通过子类对继承父类方法的重定义来实现。使用时注意:在子类重定义父类方法时,要求与父类原型(参数个数、类型、顺序)完全相同。重写方法的调用规则–对于重写的方法,Java运行时系统根据调用该方法的实例的类型来决定选择哪个方法调用。对于类的一个实例,如果子类重写了父类的方法,则运行时系统调用子类的方法。如果子类继承了父类的方法(未重),则运行时系统调用父类的方法。因此,一个对象可以通过引用子类的实例来调用于类的方法。【例6-15】重写方法的调用规则示例。classA{voidcallme(){System.out.println(InsideA'scallme()method);}}classBextendsA{voidcallme(){System.out.println(InsideB'scallme()method);}}publicclassDispatch{publicstaticvoidmain(Stringargs[]){Aa=newB();a.callme();}}运行结果为:InsideB'scallme()method方法重写的两个原则:–改写后的方法不能比被重写的方法有更严格的访问权限。–改写后的方法不能比被重写的方法产生更多的例外。2、重载实现多态性重载实现多态性是通过定义类中的多个同名的不同方法来实现的。编译时则根据参数(个数、类型、顺序)的不同来区分不同的方法。通过重载可定义多种同类的操作方法,调用时根据不同需要选择不同的操作。–与方法的覆盖不同,重载不是子类对父类同名方法的重新定义,而是类对自身已有的同名方法的重新定义。–由于重载发生在一个类里,不能用类名来区分不同的方法,所以采用不同的形式参数列表,包括形式参数的个数、类型、顺序的不同,来区分重载的方法。【例】重载实现多态性举例。该类中定义了矩形,用四个实例变量来定义这个矩形的左上角和右下角的坐标,x1、y1、x2、y2。另外定义了三个同名的不同buildRect()方法为这些实例变量设置值。importjava.awt.Point;classMyRect{intx1=0;inty1=0;intx2=0;inty2=0;}MyRectbuildRect(intx1,inty1,intx2,inty2){this.x1=x1;this.y1=y1;this.x2=x2;this.y2=y2;returnthis;}MyRectbuildRect(PointtopLeft,PointbottomRight){x1=topLeft.x;y1=topLeft.y;x2=bottomRight.x;y2=bottomRight.y;returnthis;}MyRectbuildRect(PointtopLeft,intw,inth){x1=topLeft.x;y1=topLeft.y;x2=(x1+w);y2=(y1+h);returnthis;}voidprintRect(){System.out.println(MyRect:+x1+,+y1);System.out.println(,+x2+,+y2+);}publicstaticvoidmain(Stringargs[]){MyRectrect=newMyRect();rect.buildRect(25,25,50,50);rect.printRect();System.out.println(******);rect.buildRect(newPoint(10,10),newPoint(20,20));rect.printRect();System.out.println(******);rect.buildRect(newPoint(10,10),50,50);rect.printRect();System.out.println(******);}}9.2抽象类与接口抽象类抽象类:用abstract关键字来修饰的类。–声明为abstract的类不能被实例化。它只提供了一个基础,为了实例化,该类必须作为父类,子类可以通过继承它,然后添加自己的属性和方法形成具体的有意义的类。–抽象类必须被继承。抽象方法:用abstract来修饰一个方法时,该方法叫做抽象方法。–抽象方法必须被重写–抽象方法只有声明,不能有实现–定义了抽象方法的类必须是抽象类【例】抽象类举例。abstractclassA{abstractvoidcallme();voidmetoo(){System.out.println(InsideA'smetoo()method);}}classBextendsA{voidcallme(){System.out.println(InsideB'scallme()method);}}publicclassAbstract{publicstaticvoidmain(Stringargs[]){Ac=newB();c.callme();c.metoo();}}接口接口(interface)就是方法定义和常量值的集合。从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有方法的实现。–通过接口可以实现不相关类的相同行为,而不需要考虑这些类之间的层次关系。–通过接口可以指明多个类需要实现的方法。–通过接口可以了解对象的交互界面,而不需了解对象所对应的类。接口是用来实现类间多重继承功能的结构.–在Java中,出于简化程序结构的考虑,不支持类间的多重继承而只支持单重继承,即一个类至多只能有一个直接父类。接口的实现功能比多重继承更强–接口把方法的定义和类的层次区分开来,通过它可以在运行时动态地定位所调用的方法;–同时,也可以实现“多重继承”,且一个类可以实现多个接口。–正是这些机制使得接口提供了比多重继承更简单,更灵活,而且更强健的功能。1.接口的定义[public]interface接口名[extends接口列表]{……//常量定义和方法定义}–public指明任意类均可以使用这个接口。在缺省情况下,只有与该接口定义在同一个包中的类才可以访问这个接口。–extends子句与类声明中的extends子句基本相同,不同的是一个接口可以有多个父接口,用逗号隔开,而一个类只能有一个父类。子接口继承父接口中所有常量和方法。接口体中包括常量定义和方法定义,其格式如下所示:–typeconstantName=Value;–returnTypemethodName([paramList]);在接口中定义的常量可以被用来实现该接口的多个类共享,与C语言中的const定义常量是相似的。在接口中定义的常量具有public、final、static的属性。接口中只进行方法的声明,而不提供方法的实现,所以,方法定义没有方法体,且用分号(;)结尾。在接口中声明的方法具有public和abstract属性。另外,如果在子接口中定义了和父

1 / 44
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功