《继承和多态上》PPT课件.ppt

上传人:za****8 文档编号:12723104 上传时间:2020-05-19 格式:PPT 页数:41 大小:542.06KB
返回 下载 相关 举报
《继承和多态上》PPT课件.ppt_第1页
第1页 / 共41页
《继承和多态上》PPT课件.ppt_第2页
第2页 / 共41页
《继承和多态上》PPT课件.ppt_第3页
第3页 / 共41页
点击查看更多>>
资源描述
Java语言概述,1,第六讲继承和多态(上),西亚斯学院计算机系姜斌2011年,Java语言概述,2,课堂内容,一、继承的概念1、继承涵义2、继承定义,父类和子类定义3、继承例子二、类库继承例子1、Object类2、例子三、扩展类1、继承关系的语法定义2、属性继承和隐藏3、方法继承,覆盖和重载*4、子类中构造函数的使用四、Abstract继承,一、继承涵义和定义,1、涵义,继承(Inheritance):三大特性之一类之间的继承关系是现实世界中遗传关系的直接模拟,一方面,它表示类之间的扩展性的联系以及对属性和操作的共享,即子类可以沿用父类(被继承类)的某些特征。另一方面,子类也可以具有自己独立的属性和操作,1、涵义,事物之间最基本联系:1)“ISA”关系继承是一个“ISA”关系有时也称为“普通”和“特殊”的联系新扩展出来的类是原有类的某一个特例,可有一个或多个子类或扩展类存在,继承关系,Java语言概述,6,组合关系,2)“HASA”关系一个事物所具有其他事物其他事物是其组成部分,这种一般称为“组合”或“聚合”关系(要和继承区别开),Java语言概述,7,2、继承定义,继承性是指一个新的类继承原有类的基本特性,并增加新的特性;原有类称为父类或基类,新的类称为子类或扩展类。特征:软件复用的一种形式。新类由已存在的类生成,可以不去从头去定义一个新类;如果子类只从一个父类继承,则称为单继承;如果子类从一个以上父类继承,则称为多继承(在java中没有多继承,类似结构通过接口实现)。,继承关系是可以传递的,如左图,E继承C,而C继承A,因而E也继承了A,所以E也是A的子类,是间接子类,C是A的直接子类ClassCextendsAClassFimplementsC,D;ClassEimplementsB,D(C,B,D为接口类),Java语言概述,9,3、继承例子,例3,飞机、汽车和轮船可归于交通工具类,飞机/汽车/轮船可以继承交通工具类某些属性和操作,所以交通工具和飞行器/汽车/轮船之间是继承关系,例2,企业中员工可以有不同特殊员工,如经理是特殊的员工,所以,员工和经理类之间是继承关系,例1,动物有不同种类,例如:猫科类和鸟类,所以,动物和猫/鸟之间是继承关系,二、类库继承例子,Java语言概述,11,1.Object类类中的“黄帝”,是一个特殊的类,所有类(包括类库中的和用开发者创作的类都属于其子类,并继承其内容)Object类是所有类的根.每个类都以它来作为超类,所有的类,包括数组(arrays),都可实现覆盖Object类中的方法.每个类都隐藏地扩展了此类,即等同于在类地声明时加入,“extendsObject”,Java语言概述,12,Object类的方法,常用的方法:StringtoString()输出关于对象的描述信息,可以被覆盖返回对象的字符串表示。Object的方法返回一个字符串、包含该对象的类名、一个字符和实例散列码(哈希)的十六进制表示。,protectedObjectclone()创建并返回此对象的一个副本。(在子类中不要依赖Object的这个方法。)booleanequals(Objectobj)指示某个其他对象是否与此对象“相等”。(在子类中不要依赖Object的这个方法。)protectedvoidfinalize()当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。ClassgetClass()返回一个对象的运行时类。InthashCode()返回该对象的哈希码值。,2、类库类的继承特例,由于所有类都是由继承java.lang.Object而来,所以类库的类都是Object的类的直接或间接子类。例如:java.lang.String直接继承Objectjavax.swing.JOptionPane间接继承Obejct用户自定义类也直接或间接继承Object,3、定义思考,我们定义的飞机类Plane,其实隐含继承ObjectclassPlaneextendsObject/系统在编译时自动执行例如可以在Plane类中我们定义有toString方法,这个实际继承了覆盖了父类Object同名方法;方法为:publicStringtoString()return(speedis:+speed+nlookis:+look);思考:如果我们不定义这个方法会怎么样,三、继承的实现定义扩展类,Java语言概述,17,父类名跟在extends关键字后面,用来说明当前类是哪个已经存在类的子类,存在继承关系。,定义顺序:1)定义父类“动物类”Animal;2)然后定义子类“猫类”Cat;ClassCatextendsAnimal,子类从父类继承有两个主要的方面:(1)属性的继承。例如,员工是一个父类,有名字、薪水和聘用日期属性。子类继承所有属性(2)方法的继承。一个父类定义了若干操作,如属性获取的三个get方法,加薪方法,它们要被继承。,1、继承关系定义,声明类头-父类名,Java语言概述,18,1)在动物类中包含基本属性,在Cat中包括特有属性“爪子数”,在Bird类中有“翅膀数”属性;2)(见Employee类的代码)Employee类是一个父类。因为子类是父类的扩展,增加了父类没有的属性和方法protectedStringname;/在Employee类中protecteddoublesalary;protectedDatehireDay;/上述属性已经被继承/在Manager类中privatedoublebonus;/经理才有业绩金,我是扩展类!,2属性继承与隐藏,子类继承了父类成员属性和方法,同时提供更多特有属性和方法,比它们的父类具有更多的功能,,Java语言概述,19,2属性继承与隐藏,对于父类来说,属性的作用域范围和属性设置是有要求的,要求如下:父类代码中定义的private属性是访问范围在子类无法访问到。,(1)子类可以访问其父类的protected或public(不推荐)成员;推荐设成protected(2)protected访问是为了体现继承关系来专门提供的访问范围。(3)由于被继承的父类成员没有在子类声明中列出,但是这些成员确实存在于子类中。,Java语言概述,20,2属性继承与隐藏,Manger类增添了一个新的字段用于存储奖金,并且增添了一个新方法用于设置它的值:(它继承了Employee中的所有属性和方法)classManagerextendsEmployeepublicvoidsetBonus(doubleb)bonus=b;privatedoublebonus;,Java语言概述,21,3方法继承、覆盖与重载,对于Manager对象,可以使用getName和getHireDay等方法。即使这些方法没有明显地在Manager类中定义,它们也自动地从Employee类中继承过来了。(注意Object是所以类的超类,见附录)2)方法覆盖(MethodsOverriding)方法的覆盖是指:子类定义同名方法来覆盖父类的方法,是多态技术的一个实现。当父类方法在子类中被覆盖时,通常是子类版本在方法被子类对象调用时动态使用,并做一些附加的工作。,1)方法继承(MethodsInheriting),Java语言概述,22,方法覆盖实现如下:Override,如果Employee中定义了getSalary()方法,Manager类中也要定义getSalary()方法,那么有两种情况,a,一种是方法体完全重写;b,一种是调用父类中的该方法,再加一些语句。PublicdoublegetSalary()doublebaseSalary=super.getSalary();returnbaseSalary+bonus;Super使编译器调用父类方法的一种手段。,Java语言概述,23,关于覆盖应注意的事项:,(1)不使用super而希望引用父类方法会导致无限的递归,因为子类方法实际上是在调用它自己。(2)方法覆盖中,子类在重新定义父类已有的方法时,应保持与父类完全相同的方法头声明,即与父类完全相同的方法名、返回值和参数列表。(3)子类可以添加字段,也可以添加方法或者覆盖父类中的方法。然而,继承不能去除父类中的任何字段和方法。,Java语言概述,24,3)方法重载(MethodsOverloading),重载的定义:可以用相同的方法名但不同的参数表来定义方法(参数表中参数的数量、类型或次序有差异),注意方法的限定符相同,返回值类型相同,这称为方法重载。,重载(overloading):当多个方法具有相同的名字而含有不同的参数时,便发生重载。编译器必须挑选出调用哪个方法。它通过将在不同方法头部中的参数类型和在特定的方法调用中使用值的类型进行比较,从而挑选出正确的方法。,Java语言概述,25,注意重载不是子类对父类同名方法的重新定义,而是类对自身已有同名方法的重新定义:A)java中允许对任何方法重载。所有,要描述一个方法,需要指定方法的名字以及它的参数类型。此表达式被称为方法的型构(Signiture)例如:String类有四个叫做indexOf的方法,它们的型构不同:indexOf(int);indexOf(String)indexOf(int,int);indexOf(String,int)B)注意:返回值类型不是方法特征中的一部分。即不能有这样的两个方法:它们具有相同的名字和参数类型,但只是具有不同的返回值类型。,Java语言概述,26,4在子类中使用构造函数,子类构造函数也不能直接访问父类中的私有字段(1)子类构造函数总是先调用(显式的或隐式地)其父类的构造函数,以创建和初始化子类的父类成员。(2)构造函数不能继承,它们只属于定义它们的类。(3)当创建一个子类对象时,子类构造函数首先调用父类的构造函数并执行,接着才执行子类构造函数。见书上构造器规则(P74,段1),Java语言概述,27,如果构造函数有参数时,子类构造函数在使用时可先执行父类带有参数的构造函数。Person(Stringn,inti)name=n;age=i;Student(Stringn,inti,Stringj)super(n,i);Sno=j;,/要放在子类构造器第一行,四、抽象类与抽象方法,abstract是抽象修饰符,可以用来修饰类或方法。,1、抽象类(abstract)现实生活中,可以发现很多事物可以认为是同一种概念,而这个概念只是抽象的概念。例如:“交通工具”,“鸟”,“人”等等;相对应有些事物是具体的:如“自行车”,“三轮车”,“卡车”;“麻雀”,“老鹰”;“学生”,“职工”等等;,实际的使用中动物是一个“抽象概念”,我们可以把刚才例子改一下,如何抽象?,Code:publicclasscatextendsAnimal.publicclassBirdextendsAnimal.,RETURN,2、抽象类(abstract)抽象类是针对具体类(Concrete)来说的,抽象类和具体类是继承的关系(抽象继承)。当一个类被声明为abstract时,这个类被称为是抽象类。所谓抽象类就是没有具体实例对象的类。抽象类包含了一些概念基本的属性和抽象方法,具体类包含子类特殊的属性和方法。,详细,new,Animalcat1=newCat();/向上转型Animalcat2=newCat();Animalbird1=newBird();,见例子TestExtends2,注意:抽象类不能实例化,3、抽象方法作为类方法修饰符,abstract则声明了一种仅有方法头,而没有具体的方法体和操作实现的抽象方法。只含有一个声明,没有方法主体。下面是抽象方法声明时采用的语法:abstractvoidmethodName();抽象类中:abstract方法只有方法头的声明,而用一个分号来代替方法体的定义:子类:在继承的子类中,对于抽象方法要求实现,方法头和抽象方法一样。(如果还有子类,这个类还可定义为抽象类),抽象方法很重要,在Java编程语言中抽象方法是非常重要的概念。不仅抽象类,在接口里你会大量的用到它。,Java语言概述,34,小结,继承的涵义和概念,是现实什么关系体现?父类和子类的概念,又叫做什么?如何定义Java继承关系,关键词是?继承中属性和方法的特点,this和super关键词的用法什么是抽象类,,Java语言概述,35,作业,做书上课后题1,2理解Manager继承Employee的例子(代码见我的课后任务包(实验时ftp上下载,包括Employee,Manager,InheritanceTest.java)。通过Manager例子的理解,自己思考工资系统的UML图设计,实现工资系统的例子;,附录,UML说明和,Java语言概述,37,特别例子:继承的应用示范(点,圆的抽象),+setPoint(),+toString(),-X:int,-Y:intr,Point,+setRadius(),+getRadius(),-,Circle,+getX(),+getY(),-radius,+toString(),+area(),点和圆的关系是一种继承关系,圆可以理解成具有半径的点。,Java语言概述,38,6扩展类继承的应用示范,(见例子5-2)现在讨论一个继承性的具体例子5-2,点、圆的层次结构。首先建立并使用Point类,然后从point类继承产生Circle类。程序的模块:(1)模块1:程序定义了一个Point类;(2)模块2:又定义了Circle类,它是从Point类继承来的;(3)应用程序,该程序演示了如何把子类引用指定为父类引用,以及把父类引用强制转换为子类引用,Java语言概述,39,(1)创建Circle类,继承了Point类。(2)在Point类和Circle类中用完全相同的signature(架构)覆盖toString方法。注意:(1)子类构造函数总是先调用(显式的或隐式地)其父类的构造函数,以创建和初始化子类的父类成员;构造函数不能继承,它们只属于定义它们的类。(2)父类的实例变量可用Protected限定,因此,从Point衍生Circle类时,Circle类的方法能直接引用坐标x和y,而不必使用get方法来访问。,抽象继承关系(人和员工/学生继承关系),+raiseSalary(),+getSalary(),+getDescription(),-salary:Double,Employee,+changeMajor(),+getMajor(),+getDesciption(),-Major:String,Student,+getName();,+getDescription(),-name:String,Person,RETURN,PLEASEPREPAREYOURCLASSES&WRITEYOUASSIGNMENTBEFOREHAND!PRIOR-NOTONCLASS,
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!