《电子教案专业知识讲座省公共课一等奖全国赛课获奖课件.pptx》由会员分享,可在线阅读,更多相关《电子教案专业知识讲座省公共课一等奖全国赛课获奖课件.pptx(50页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第5 5章章 继承、接口与泛型继承、接口与泛型n 本章导读本章导读n1.子类与父类n2.子类继承性n3.子类对象结构过程n4.组员变量隐藏和方法重写n5.super关键字n6.final类与final方法n7.对象上转型对象第1页第第5 5章章 继承、接口与泛型继承、接口与泛型n8.继承与多态n9.使用abstract类n10.接口n11.接口回调n12.内部类n13.匿名类n14.异常类n15.泛型类第2页5.1 5.1 子类与父类子类与父类 上一章我们主要学习了类和对象相关知识,讨论了类组成以及用类创建对象等主要问题,本章主要介绍类继承、和继承相关多态性以及接口等主要概念。本章还初步介绍
2、了SDK1.5新推出泛型。子类与父类子类与父类 继承是一个由已经有类创建新类机制。利用继承,我们能够先创建一个共有属性普通类,依据该普通类再创建含有特殊属性新类,新类继承普通类状态和行为,并依据需要增加它自己新状态和行为。由继承而得到类称为子类,被继承类称为父类(超类)。第3页5.1 5.1 子类与父类子类与父类 父类能够是自己编写类也能够是java类库中类。利用继承有利于实当代码重复使用,子类只需要添加新功效代码即可。Java不支持多重继承,即子类只能有一个父类。使用关键字extends来申明一个类是另外一个类子类,格式以下:class 子类名 extends 父类名 .返回返回第4页5.2
3、 5.2 子类继承性子类继承性 1继承定义 所谓类继承就是子类继承父类组员变量和方法作为自己组员变量和方法,就好象它们是在子类中直接申明一样。当然,子类能否继承父类变量和方法还有一定限制。下面对其进行详细介绍。2子类和父类在同一包中继承性 假如子类和父类在同一个包中,那么子类自然地继承了其父类中不是private组员变量作为自己组员变量,而且也自然地继承了父类中不是private方法作为自己方法。继承组员变量以及方法访问权限保持不变。第5页5.2 5.2 子类继承性子类继承性下面我们看一个例子。程序运行结果见下列图第6页5.2 5.2 子类继承性子类继承性 3子类和父类不在同一包中继承性 假如
4、子类和父类不在同一个包中,那么子类只能继承父类protected、public组员变量和方法,继承组员或方法访问权限不变。假如子类和父类不在同一个包里,子类不能继承父类友好变量和友好方法。返回返回第7页5.3 5.3 子类对象结构过程子类对象结构过程 当用子类结构方法创建一个子类对象时,子类结构方法总是先调用父类某个结构方法,假如子类结构方法没有指明使用父类哪个结构方法,子类就调用父类不带参数结构方法。所以,我们能够这么来了解子类创建对象:(1)将子类中申明组员变量做为子类对象组员变量。子类未继承组员 子类未继承组员 引用子类对象 子类继承组员 子类继承组员 子类申明组员 子类申明组员图 (2
5、)父类组员变量也都分配了内存空间,但只将其中一部分(继承那部分)做为子类对象组员变量。父类private组员变量尽管分配了内存空间,但它不作为子类成第8页5.3 5.3 子类对象结构过程子类对象结构过程 元变量,即父类私有组员不归子类管理。方法继承性与组员变量相同。但若子类和父类不在同一包中,尽管父类友好组员分配了内存空间,但也不作为子类组员。子类对象内存示意图以下列图 子类未继承组员 子类未继承组员 引用子类对象 子类继承组员 子类继承组员 子类申明组员 子类申明组员第9页5.3 5.3 子类对象结构过程子类对象结构过程 上页示意图中“叉号”表示子类中申明定义方法不能够操作这些内存单元,“对
6、号”表示子类中申明定义方法能够操作这些内存单元。经过上图,给我们有感觉好象:子类创建对象时似乎浪费了一些内存,因为当用子类创建对象时,父类组员变量也都分配了内存空间,但只将其中一部分做为子类对象组员变量,但实际情况并非如此,我们需注意到,子类中还有一部分方法是从父类继承,这部分方法却能够操作这部分变量。下面例子中,子类对象调用继承方法操作这些未被子类继承却分配了内存空间变量。返回返回第10页5.4 5.4 组员变量隐藏和方法重写组员变量隐藏和方法重写 1组员变量隐藏 子类能够隐藏继承组员变量,当在子类中定义和父类中同名组员变量时,子类就隐藏了继承组员变量,即子类对象以及子类自己申明定义方法操作
7、与父类同名组员变量。下面我们看一个例子,在这个例子中子类隐藏了从父类继承double型变量。该程序运行结果以下:第11页5.4 5.4 组员变量隐藏和方法重写组员变量隐藏和方法重写 2方法重写 子类也能够隐藏方法,子类经过方法重写来隐藏继承方法。方法重写是指:子类中定义一个方法,而且这个方法名字、返回类型、参数个数和类型与从父类继承方法完全相同。子类经过方法重写能够把父类状态和行为改变为本身状态和行为。这时,假如子类想使用被隐藏方法,必须使用关键字super,我们将在后面讲述super使用方法。下面这个例子能够帮助我们更加好了解方法重写。第12页5.4 5.4 组员变量隐藏和方法重写组员变量隐
8、藏和方法重写 需要注意是:需要注意是:方法重写时一定要确保方法名字、类型、参数个数和类型同父类某个方法完全相同,只有这么,子类继承这个方法才被隐藏。假如子类在准备隐藏继承方法时,参数个数或参数类型与父类方法不尽相同,那实际上也没有隐藏继承方法,这时子类就出现两个方法含有相同名字。下面我们看个例子。程序运行结果如右图:第13页5.4 5.4 组员变量隐藏和方法重写组员变量隐藏和方法重写 3访问修饰符protected深入说明 一个类A中protected组员变量和方法能够被它直接子类和间接子类继承,比如B是A子类,C是B子类,D又是C子类,那么B、C和D类都继承了A protected组员变量和
9、方法。假如用D类在D本身中创建了一个对象,那么该对象总是能够经过“.”运算符访问继承或自己定义protected变量和protected方法,不过,假如在另外一个类中,比如E类,用D类创建了一个对象object,该对象经过“.”运算符访问protected变量和protected方法权限以以下(a)、(b)所述。第14页5.4 5.4 组员变量隐藏和方法重写组员变量隐藏和方法重写 (a)子类Dprotected组员变量和方法,假如不是从父类继承来,object访问这些protected组员变量和方法时,只要E类和D类在同一个包中就能够了。(b)假如子类D对象protected组员变量或prot
10、ected方法是从父类继承,那么就要一直追溯到该protected组员变量或方法“祖先”类,即A类,假如E类和A类在同一个包中,object对象能访问继承protected变量和protected方法。返回返回第15页5.5 Super 5.5 Super 关键字关键字 Super关键字有两种使用方法:一个使用方法是子类使用super调用父类结构方法,另一个使用方法是子类使用super调用被子类隐藏组员变量和方法。1使用super调用父类结构方法 子类不继承父类结构方法,所以,子类假如想使用父类结构方法,必须在子类结构方法中使用而且必须使用关键字super来表示,而且super必须是子类结构方
11、法中第一条语句。在下面例子中,子类结构方法中使用super调用父类结构方法。第16页5.5 Super 5.5 Super 关键字关键字 2使用super操作被隐藏组员变量和方法 当子类中定义了一个方法,而且这个方法名字、返回类型、参数个数和类型和父类某个方法完全相同时,子类从父类继承这个方法将被隐藏。假如我们在子类中想使用被子类隐藏组员变量或方法就能够使用关键字super。在下面这个例子中,子类使用super调用被隐藏组员变量和方法。其结果以下:返回返回第17页5.6 final 5.6 final 类和类和finalfinal方法方法 final类不能被继承,即不能有子类,如:final
12、class A 将一个类申明为final类普通是因为安全性考虑。因为一旦一个方法被修饰为final方法,则这个方法不能被重写,即不允许子类经过重写隐藏继承final方法。返回返回第18页5.75.7对象上转型对象对象上转型对象 1对象上转型 我们经常说“老虎是哺乳动物”、“狗是哺乳动物”等。若哺乳类是老虎类父类,这么说当然正确,但当你说老虎是哺乳动物时,老虎将失掉老虎独有属性和功效。下面我们就介绍对象上转型对象。假设,B是A子类或间接子类,当我们用子类B创建一个对象,并把这个对象引用放到A类申明对象中时,比如:A a;a=new B();第19页5.75.7对象上转型对象对象上转型对象 那么就
13、称对象a是子类对象b上转型对象,对象上转型对象实体是子类负责创建,但上转型对象会失去原对象一些属性和功效。上转型对象含有以下特点(见下列图所表示)。对象对象上转型对象继承或隐藏组员变量继承或重写方法新增变量新增方法第20页5.75.7对象上转型对象对象上转型对象 (1)上转型对象不能操作子类申明定义组员变量;也不能使用子类申明定义方法。(2)上转型对象能够操作子类继承组员变量和隐藏组员变量,也能够使用子类继承或重写方法。(3)上转型对象不能操作子类新增方法和组员变量 (4)能够将对象上转型对象再强制转换到一个子类对象,这时,该子类对象又具备了子类全部属性和功效。为了更加好了解对象上转型,我们先
14、看个例子。第21页5.75.7对象上转型对象对象上转型对象 不要将父类创建对象和子类对象上转型对象混同,对象上转型对象实体是由子类负责创建,只不过失掉了一些属性和功效而已。对于对象上转型好处我们在后面将对比介绍。返回返回第22页5.8 5.8 继承与多态继承与多态 和继承相关多态性是指父类某个方法被其子类重写时,能够产生自己功效行为,即同一个操作被不一样类型对象调用时可能产生不一样行为。比如,狗和猫都含有哺乳类功效:“叫声”,当狗操作“叫声”时产生声音是“汪汪,而猫操作“叫声”时产生声音是“喵喵”,这就是“叫声”多态。当一个类有很多子类时,而且这些子类都重写了父类中某个方法。当我们把子类创建对
15、象引用放到一个父类对象中时,就得到了该对象一个上转型对象,那么这个上转型对象在调用这个方法时就可能含有各种形态。第23页5.8 5.8 继承与多态继承与多态 因为不一样子类在重写父类方法时可能产生不一样行为。也就是说,不一样对象上转型对象调用同一方法可能产生不一样行为。下面让我们看一个例子来更加好地了解继承与多态和对象上转型对象。程序运行结果以下列图:返回返回第24页5.9 5.9 使用使用abstract abstract 类类 用关键字abstract修饰类称为abstract类(抽象类)。如:abstract class A abstract类不能用new运算符创建对象,必须产生其子类,
16、由子类创建对象。若abstract类类体中有abstract方法,只允许申明,而不允许实现,而该类子类必须实现abstract方法,即重写父类abstract方法。一个abstract类只关心子类是否含有某种功效,不关心功效详细实现。详细实现由子类负责。下面我们看一个例子:第25页5.9 5.9 使用使用abstractabstract类类 现在让我们来分析一下上面例子,在这个例子中,我们用到了abstract类和对象上转型对象。我们能够看到我们在一个方法就结构了一个即包含圆锥又包含以梯形为底锥(Cone(Geometry bottom,double height),若我们不用abstract
17、类和对象上转型对象,这里我们最少要使用两个结构方法。这里是只包括圆锥和梯形锥,若是在有其它很各种形式锥,这里工作量将非常大,这就是我们为何使用abstract类和对象上转型对象。当然当我们学习接口后我们还能够使用接口实现这种功效。这在后面将详细介绍。返回返回第26页5.10 5.10 接口接口 Java不支持多继承性,即一个类只能有一个父类。单继承性使得Java简单,易于管理程序。为了克服单继承缺点,Java使用了接口,一个类能够实现多个接口。使用关键字interface来定义一个接口。接口定义和类定义很相同,分为接口申明和接口体。1接口申明与使用(1)接口申明我们曾使用关键字class来申明
18、类,接口经过使用关键字interface来申明,格式:interface 接口名字 第27页5.10 5.10 接口接口(2)接口体 接口体中包含常量定义和方法定义两部分。接口体中只进行方法申明,不许提供方法实现,所以,方法定义没有方法体,且用分号“;”结尾。(3)接口使用 一个类经过使用关键字implements 申明自己实现一个或多个接口。假如实现多个接口,用逗号隔开接口名,如:class A implements Printable,Addable第28页5.10 5.10 接口接口 假如一个类实现某个接口,那么这个类必须实现该接口全部方法,即为这些方法提供方法体。要注意是,接口中方法被
19、默认是public和abstract,接口在申明方法时能够省略方法前面public和abstract关键字,不过,类在实现接口方法时,一定要用public来修饰。类实现接口方法以及接口中常量能够被类对象调用。假如父类实现了某个接口,则其子类也就自然实现这个接口。接口也能够被继承,即能够经过关键字extends申明一个接口是另一个接口子接口。现在我们看一个例子来看一看类是怎样实现接口。第29页5.10 5.10 接口接口 2接口与多态 接口语法规则很轻易记住,但真正了解接口更主要。你可能注意到,在上述例子中假如去掉接口,并把程序中a.MAX、b.MAX去掉,上述程序运行没有任何问题。那为何要用接
20、口呢?假如轿车、拖拉机、客车都是机动车子类,其中机动车是一个抽象类。假如机动车中有3个抽象方法:“刹车”、“收取费用”、“调整温度”,那么全部子类都要实现这3个方法,产生各自收费或控制温度行为。这显然不符合人们思维方法,因为拖拉机可能不需要有“收取费用”或“调整温度”功效,合理处理就是去掉机动车“收取费用”和“调整温度”这两个方法。假如允许多继承,轿车第30页5.10 5.10 接口接口 类想含有“调整温度”功效,轿车类能够是机动车子类,同时也是另外一个含有“调整温度”功效类子类。多继承有可能增加了子类负担,因为轿车可能从它多个父类继承了一些并不需要功效。Java支持继承,但不支持多继承,即一
21、个类只能有一个父类。单继承使得程序愈加轻易维护和健壮,多继承使得编程愈加灵活,但却增加了子类负担,使用不妥会引发混乱为了使程序轻易维护和健壮,且不失灵活性,Java使用了接口,一个类能够实现多个接口,接口能够增加很多类都需要实现功效,不一样类能够使用相同接口,同一个类也能够实现多个接口。第31页5.10 5.10 接口接口 接口思想在于它能够增加很多类都需要实现功效,使用相同接口类不一定有继承关系,就象各式各样商品,它们可能隶属不一样企业,工商部门要求都必须含有显示商标功效(实现同一接口),但商标详细制作由各个企业自己去实现。返回返回第32页5.11 5.11 接口回调接口回调 在讲述继承与多
22、态时,我们经过子类对象上转型表达了继承多态性,即把子类创建对象引用放到一个父类对象中时,得到该对象一个上转型对象,那么这个上转型对象在调用方法时就可能含有各种形态,不一样对象上转型对象调用同一方法可能产生不一样行为。1接口回调 接口回调是多态另一个表达,接口回调是指:能够把使用某一接口类创建对象引用赋给该接口申明接口变量中,那么该接口变量就能够调用被类实现接口中方法,当接口变量调用被类实现接口中方法时,就是通知对应对象调用接口方法,这一过程称作对象功效接口回调。第33页5.11 5.11 接口回调接口回调 不一样类在使用同一接口时,可能含有不一样功效表达,即接口方法体无须相同,所以,接口回调可
23、能产生不一样行为。下面我们看看使用了接口回调技术例子。2接口做参数 当一个方法参数是一个接口类型时,假如一个类实现了该接口,那么,就能够把该类实例引用传值给该参数,参数能够回调类实现接口方法。下面我们再看一个接口做参数例子。结果以下:返回返回第34页5.12 5.12 内部类内部类 我们已经知道:类能够有两种主要组员:组员变量和方法,类还能够有一个组员:内部类。Java支持在一个类中申明另一个类,这么类称作内部类,而包含内部类类成为内部类外嵌类。内部类同类中申明方法或组员变量一样,一个类把内部类看作是自己组员。外嵌类组员变量在内部类中依然有效,内部类中方法也能够调用外嵌类中方法。内部类类体中不
24、能够申明类变量和类方法。外嵌类能够用内部类申明对象,作为外嵌类组员。下面让我们结合这个例子更加好了解内部类。返回返回第35页5.13 5.13 匿名类匿名类 1和类相关匿名类 当使用类创建对象时,程序允许我们把类体与对象创建组合在一起,也就是说,类创建对象时,除了结构方法还有类体,这类体被认为是该类一个子类去掉类申明后类体,称作匿名类。匿名类就是一个子类,因为无名可用,所以不可能用匿名类申明对象,但却能够直接用匿名类创建一个对象。假设Hello是类,那么以下代码就是用Hello一个子类(匿名类)创建对象:第36页5.13 5.13 匿名类匿名类 new Hello()匿名类类体 匿名类能够继承
25、类方法也能够重写类方法。我们使用匿名类时,必定是在某个类中直接用匿名类创建对象,所以匿名类一定是内部类,匿名类能够访问外嵌类中组员变量和方法,匿名类不能够申明static组员变量和static方法。匿名类主要用途就是向方法参数传值。下面例子展示了匿名类使用方法。第37页5.13 5.13 匿名类匿名类 2和接口相关匿名类 假设Computable是一个接口,那么,Java允许直接用接口名和一个类体创建一个匿名对象,这类体被认为是实现了Computable接口类去掉类申明后类体,称作匿名类。以下代码就是用实现了Computable接口类(匿名类)创建对象:new Computable()实现接口
26、匿名类类体 第38页5.13 5.13 匿名类匿名类 假如某个方法参数是接口类型,那么我们能够使用接口名和类体组合创建一个匿名对象传递给方法参数,类体必须要实现接口中全部方法。下面例子16展示了和接口相关匿名类使用方法。程序运行结果以下:返回返回第39页5.14 5.14 异常类异常类 所谓异常就是程序运行时可能出现一些错误,比如试图打开一个根本不存在文件等,异常处理将会改变程序控制流程,让程序有机会对错误作出处理。这一章将对异常给出初步介绍,而Java程序中出现详细异常问题在对应章节中还将讲述。当程序运行出现异常时,Java运行环境就用异常类Exception对应子类创建一个异常对象,并等候
27、处理 ava 使用trycatch语句来处理异常,将可能出现异常操作放在trycatch语句try部分,当try部分中某个语句发生异常后,try部分将立刻结束执行,而转向执行对应catch部分;第40页5.14 5.14 异常类异常类 所以程序能够将发生异常后处理放在 catch部分。1trycatch语句trycatch语句格式以下:try 包含可能发生异常语句 catch(ExceptionSubClass1 e)第41页5.14 5.14 异常类异常类 catch(ExceptionSubClass2 e)各个catch参数中异常类都是Exception某个子类,表明 try部分可能发生
28、异常,这些子类之间不能有父子关系,不然保留一个含有父类参数catch即可。下面我们看一个例子,在这个例子中,我们试图将一个非数字字符转变成整形数,这时就发生NumberFormatException异常。我们把可能出现异常操作放在trycatch语句中,就可实现对应操作。第42页5.14 5.14 异常类异常类 2自定义异常类 我们也能够扩展Exception类定义自己异常类,然后要求哪些方法产生这么异常。一个方法在申明时能够使用throws关键字申明抛出所要产生若干个异常,并在该方法方法体中详细给出产生异常操作,即用对应异常类创建对象,这将造成该方法结束执行并抛出所创建异常对 象。程序必须在
29、trycatch块语句中调用抛出异常方法。第43页5.14 5.14 异常类异常类 在下面例子中,用一个方法求偶正数平方根,所以我们自己定义了两个异常类,当向该方法传递参数是奇数时,该方法发生YourException异常,当向该方法传递参数是负数时发生MyException。返回返回第44页5.15 5.15 泛型类泛型类 泛型(Generics)是Sun企业在SDK1.5中推出,其主要目标是能够建立含有类型安全集合框架,如链表、散列映射等数据结构,关于这一点我们将在第7章4-9节分别讨论。1泛型类申明 能够使用“class 名称”申明一个类,为了和普通类有所区分,这么申明类称作泛型类,如:
30、class A 其中A是泛型类名称,E是其中泛型,也就是说我们并没有指定E是何种类型数据,它能够是任何对象或第45页5.15 5.15 泛型类泛型类 接口,但不能是基本类型数据。泛型类类体和和普通类类体完全类似,由组员变量和方法组成,如:class Chorus void makeChorus(E person,F yueqi)person.toString();yueqi.toString();第46页5.15 5.15 泛型类泛型类 2使用泛型类申明对象 使用泛型类申明对象时,必须要指定类中使用泛型详细实际类型。比如:Chorus model model =new Chorus();下面我
31、们看个例子,程序运行结果以下:第47页5.15 泛型类泛型类 Java中泛型类和C+类模板有很大不一样,在上述例子中,泛型类中泛型数据person和yueqi只能调用Object类中方法,所以“学生类”和“乐器类”都重写了Object类toString()方法。下面我们再看一个例子,我们申明了一个泛型类:锥,一个锥对象计算体积时,只关心它底是否能计算面积,并不关心底类型。第48页5.15 5.15 泛型类泛型类 3泛型接口 能够使用“interface 名称”申明一个接口,这么声名接口称作泛型接口如 interface Computer 实例第49页5.15 5.15 泛型类泛型类 Java泛型主要目标是能够建立含有类型安全数据结构,如链表、散列表等数据结构,最主要一个优点就是:在使用这些泛型类建立数据结构时,无须进行强制类型转换,即不要求进行运行时类型检验。SDK1.5是支持泛型编译器,它将运行时类型检验提前到编译时执行,使代码更安全。返回返回第50页