Java语言程序设计(自考)课件 第六章 继承与多态_第1页
Java语言程序设计(自考)课件 第六章 继承与多态_第2页
Java语言程序设计(自考)课件 第六章 继承与多态_第3页
Java语言程序设计(自考)课件 第六章 继承与多态_第4页
Java语言程序设计(自考)课件 第六章 继承与多态_第5页
已阅读5页,还剩47页未读 继续免费阅读

下载本文档

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

文档简介

第六章继承与多态学习目标能够使用extends关键字声明子类,能够正确进行对象转型能够区分方法覆盖与方法重载,能够调用本类及父类中的方法,能够覆盖父类中的方法能够正确使用final及abstract关键字声明终极成员及抽象成员。能够正确设计接口,让类实现接口本章主要内容子类12终极类与抽象类3方法覆盖与多态接口4第一节子类Java中的类层次结构为树状结构,这和自然界中描述一个事物是类似的isa关系一般与特殊的关系isa关系Manager类和Employee类之间存在重复部分实际上,适用于Employee的很多属性和方法可以不经修改就会被Manager所使用Manager与Employee之间存在“isa”关系,即Manager“isa”Employee有些对象之间虽然也是“大”与“小”的关系,但并不是一般与特殊的关系例如汽车又包括了车身与发动机,但不能说它们之间存在“isa”关系,它们只能是整体与部分的关系,一般地称为“hasa”关系extends关键字Java提供了派生机制允许程序员用以前已定义的类来定义一个新类新类称作子类原来的类称作父类或基类定义子类的格式修饰符class子类名extends父类名{

类体}如:publicclassAextendsB类A派生于类B,A为子类,B为父类示例可以使用派生机制来表示Employee和Manager类子类中只是定义额外的特性,或者进行必要的修改Manager类中有Employee类的所有变量和方法所有这些变量和方法都继承于父类中的定义派生机制改善了程序的可维护性,增加了可靠性对父类Employee所做的修改延伸至子类Manager类中Object类Object类是Java程序中所有类的直接或间接父类,处在类层次的最高点所有其他的类都是从Object类派生而来的Object类包含了所有Java类的公共属性Object():构造方法publicfinalClassgetClass():获取当前对象所属的类信息,返回Class对象publicStringtoString():按字符串对象返回当前对象本身的有关信息publicbooleanequals(Objectobj):比较两个对象是否是同一对象,是则返回true关于判相等关于对象相等的判别,在Java中有两种方式一种是使用==运算符一种是使用equals()方法这两种方式判定的都是两个对象是否是同一个对象(称为同一)如果两个对象具有相同的类型及相同的属性值,则称为相等同一的对象一定相等,但相等的对象不一定同一示例程序6.1输出分别是equals__NO和==__NO,即两种方式下判断的都是同一性由于a和b是两个独立的对象,故它们不是同一的如果通过赋值语句b=a来创建(如程序中注释掉的语句),再运行程序,看看结果是什么要判断两个对象各个属性域的值是否相同,不能使用从Object类继承来的equals方法,而需要在类声明中对equals方法进行覆盖,即重新修改这个方法给BankAccount类添加equals方法如下单重继承在类的继承机制中,它抛弃了多重继承功能,仅实现了单重继承机制多重继承是指从多个类共同派生一个子类,即一个类可以有多个父类下图中,子类1与子类3的父类都有两个,两个子类都是由多个父类派生得到的不可克服的问题如果子类的多个父类中有同名的方法和属性,那么容易造成子类实例的混乱。这是多重继承不可克服的缺点在Java中,如果一个类有父类,则其父类只能有一个,也就是只允许从一个类中扩展类。这条限制叫单重继承构造方法不能继承虽然一个子类可以从父类及祖先类中继承所有能继承的方法和成员变量,但它不能继承构造方法只有两种方式能让一个类得到构造方法一种方式是自己编写构造方法另一种方式是,在用户没有编写构造方法的时候,由系统为类提供唯一一个默认的构造方法使用父类中的成员使用父类成员示例子类不能直接访问其父类中定义的私有属性及方法,但可以使用父类中定义的公有(及保护)方法访问私有数据成员不能直接使用父类中的私有元素对象转型Java允许使用对象之父类类型的一个变量指示该对象,比如对于前面定义的Employee和Manager类,可以将子类的对象赋给父类的变量:Employeee=newManager();//子类Manager的实例赋给父类变量e这称为对象转型(casting)对象引用的赋值兼容原则允许把子类的实例赋给父类的引用。但反过来是错误的,不能把父类的实例赋给子类的引用Managerm=newEmployee(); //错误类的变量既可以指向本类实例,又可以指向其子类的实例,这表现为对象的多态性示例在程序中,有时需要判明一个引用到底指向哪个实例,这可以通过instanceof运算符来实现对象转型示例对象引用转型的规则沿类层次向“上”转型总是合法的把Manager引用转型为Employee引用。此种方式下不需要转型运算符,只用简单的赋值语句就可以完成对于向“下”转型,只能是祖先类转型到后代类,其他类之间是不允许的把Manager引用转型为Contractor引用是非法的要替换的类(赋值号右侧)必须是当前引用类型(赋值号左侧)的父类,且要使用显式转换第二节方法覆盖与多态使用类的继承关系,可以从已有的类产生一个新类。在原有特性基础上,增加了新的特性。父类中原有的方法可能不能满足新的要求,因此需要修改父类中已有的方法。这就是方法覆盖(Override),也称为方法重写或是隐藏子类中定义方法所用的名字、返回类型及参数列表和父类中方法使用的完全一样,也就是具有相同的方法签名。此时,称子类方法覆盖(重写)了父类中的方法,从逻辑上看就是子类中的成员方法将隐藏父类中的同名方法方法覆盖及其规则当子类重写父类方法时,子类与父类使用的是相同的方法名及参数列表,但可以执行不同的功能覆盖的同名方法中,子类方法不能比父类方法的访问权限更严格例如,如果父类中方法method()的访问权限是public,则子类中就不能含有private的method()方法重写示例程序6.2如果子类已经重写了父类中的方法,但在子类中还想使用父类中被隐藏的方法,可以使用super关键字程序6.3应用覆盖的规则覆盖方法的允许访问范围不能低于原方法覆盖方法所抛出的异常不能比原方法更多classSuperClass{ publicvoidmethod(){/*相关代码*/}}classSubClassextendsSuperClass{ privatevoidmethod(){/*相关代码*/} //使用private方法覆盖public方法,错误}调用父类的构造方法super关键字也可以用在构造方法中,其功能为调用父类的构造方法子类不能从父类继承构造方法,在子类的构造方法中调用父类的构造方法不失为一种良好的程序设计风格一般来讲,调用super()时参数的个数没有限制,只要其参数列表和父类中的某个构造方法的参数列表相符即可在通常情况下,没有参数的默认构造方法常被用来初始化父类对象也可以根据具体情况选择父类其他的构造方法如果要显式调用父类的构造方法,super()调用必须放在子类构造方法的开头位置多态有了多态,能够允许同一条方法调用指令在不同的上下文中做不同的事情Manager类与Employee类之间具有“isa”关系,现在假定声明了如下两个实例: Employeee=newEmployee(); Managerm=newManager();e.getDetails()与m.getDetails()将执行不同的代码e是Employee对象,将执行Employee类中的方法m是Manager对象,执行的是Manager类中的方法如何处理:Employeee=newManager();Java规定,对象要执行的方法,是与对象真正类型(运行时类型)相关的方法,而不是与引用类型(编译时类型)相关的方法变量的静态类型是出现在声明中的类型变量e的静态类型是Employee静态类型也称为引用类型,是在代码编译时确定下来的运行过程中某一时刻变量指向的对象的类型称为动态类型,这是它此刻的真正类型,变量的动态类型会随运行进程而改变本例中e的动态类型是Manager调用稍后可能被覆盖的方法的这种处理方式,称为动态绑定或后绑定动态绑定一定要到运行时才能确定要执行的方法代码在编译过程中能确定调用方法的处理方式,称为静态绑定或前绑定多态示例第三节终极类与抽象类Java中有一个重要的关键字final,它表示终极,既可以修饰一个类,也可以修饰类中的成员变量或成员方法如果一个类被定义为final,则它不能有子类如果一个方法被定义为final,则不能被覆盖如果一个变量被定义为final,则它的值不能被改变与之相对应的是关键字abstract,它可以用于类或是方法,表示抽象使用abstract修饰的方法的方法体为空修饰的类必须被子类继承终极类定义了一个final类FinalClass,当试图派生它的子类时,会导致错误finalpublicclassFinalClass{ intmemberar; voidmemberMethod(){};}classSubFinalClassextendsFinalClass{ //错误 intsubmembervar; voidsubMemberMethod(){};}终极方法终极方法不能被覆盖classFinalMethodClass{ finalvoidfinalMethod(){……} //父类中程序代码}classOverloadClassextendsFinalMethodClass{ voidfinalMethod(){……} //子类中程序代码,错误!}终极变量不能改变终极变量的值classConst{finalfloatPI=3.14f; //终极变量finalStringlanguage="Java";}publicclassUseConst{publicstaticvoidmain(Stringargs[]){Constmyconst=newConst();myconst.PI=3.1415926f; //不能再被重新赋值}}终极引用的使用示例classCar{intnumber=1234;}classFinalVariable{publicstaticvoidmain(Stringargs[]){finalCarmycar=newCar(); //终极变量,引用类型mycar.number=8888; //可以!//修改的是mycar指向的内存中的值mycar=newCar();//错误!不能修改mycar本身的值}}抽象类在程序设计过程中,有时需要创建某个类代表一些基本行为,并为其规范定义一些方法,但是又无法或不宜在这个类中就对这些行为加以具体实现,而希望在其子类中根据实际情况再去实现这些方法定义了方法但没有定义具体实现的类称为抽象类通过关键字abstract把一个类定义为抽象类每一个未被定义具体实现的方法也应标记为abstract,这样的方法称为抽象方法在程序中不能用抽象类作为模板来创建对象必须生成抽象类的一个非抽象的子类后才能创建实例抽象类可以包含常规类能够包含的任何成员方法抽象类中也可以包含构造方法抽象类与抽象方法抽象类中通常会包含抽象方法,这种方法只有方法的声明,而没有方法的实现抽象方法将在抽象类的子类中被实现除了抽象方法,抽象类中也可以包含非抽象方法,反之,不能在非抽象的类中定义抽象方法只有抽象类才能具有抽象方法抽象类示例抽象类示例例6.16抽象类的子类所继承的抽象方法同样还是抽象方法,除非提供了其父类中所有抽象方法的实现代码,否则子类还是抽象类抽象类是不能创建对象的,除非通过间接的方法来创建其子类的对象,但是可以定义一个抽象类的引用变量第四节接口接口是体现抽象类功能的另一种方式,可将其想象为一个“纯”的抽象类它允许创建者规定一个类的基本形式,包括方法名、参数列表以及返回值类型,但不规定方法体在接口中所有的方法都是抽象方法,都没有方法体可以把接口看成是特殊的抽象类,接口与抽象类都用来定义多个类的共同属性接口还可以实现与抽象类不同的功能Java不支持多重继承的概念,一个类只能从唯一的一个类继承而来这并不意味着Java不能实现多重继承的功能Java允许一个类实现多个接口,从而实现了多重继承的能

温馨提示

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

评论

0/150

提交评论