电子教案-第5章_第1页
电子教案-第5章_第2页
电子教案-第5章_第3页
电子教案-第5章_第4页
电子教案-第5章_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

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

文档简介

第5章继承、接口与泛型

本章导读1.子类与父类2.子类的继承性3.子类对象的构造过程4.成员变量隐藏和方法的重写5.super关键字6.final类与final方法7.对象的上转型对象第5章继承、接口与泛型8.继承与多态9.使用abstract类10.接口11.接口回调12.内部类13.匿名类14.异常类15.泛型类5.1子类与父类上一章我们主要学习了类和对象的有关知识,讨论了类的构成(封装)以及用类创立对象等主要问题; 本章的主要介绍类的继承、和继承有关的多态性以及接口等重要概念。5.1子类与父类子类与父类继承是一种由已有的类创立新类的机制。 利用继承,我们可以先创立一个共有属性的一般类; 根据该一般类再创立具有特殊属性的新类,新类继承一般类的状态和行为,并根据需要增加它自己的新的状态和行为。 由继承而得到的类称为子类,被继承的类称为父类〔超类〕。5.1子类与父类

父类可以是自己编写的类也可以是java类库中的类。 利用继承有利于实现代码的重复使用,子类只需要添加新的功能代码即可。 Java不支持多重继承,即子类只能有一个父类。

使用关键字extends来声明一个类是另外一个类的子类,格式如下:

class子类名extends父类名{…..}5.2子类的继承性1.继承的定义所谓类继承就是子类继承父类的成员变量和方法作为自己的成员变量和方法,就好象它们是在子类中直接声明一样。

当然,子类能否继承父类的变量和方法还有一定的限制。 继承规那么:5.2子类的继承性2.子类和父类在同一包中的继承性规那么如果子类和父类在同一个包中,那么子类自然地继承了其父类中不是private的成员作为自己的成员。 继承的成员变量以及方法的访问权限保持不变。下面我们看一个例子。去掉私有成员5.2子类的继承性3.子类和父类不在同一包中的继承规那么如果子类和父类不在同一个包中,那么子类只能继承父类的protected、public成员变量和方法; 继承的成员或方法的访问权限不变。 如果子类和父类不在同一个包里,子类不能继承父类的友好变量和友好方法。去掉友好成员+私有成员父类:packageFa;publicclassFather{ privateint

priA=10;

int

friB=20; protectedint

proC=30; publicint

pubD=40;}packageSu;importFa.*;publicclassSunextendsFather{ publicvoidprt(){ //System.out.println(priA); //System.out.println(friB);

System.out.println(proC);

System.out.println(pubD); } publicstaticvoidmain(String[]args){ Suns=newSun();

s.prt(); }}子类5.3子类对象的构造过程当用子类的构造方法创立一个子类的对象时,子类的构造方法总是先调用父类的某个构造方法。因此,我们可以这样来理解子类创立的对象:〔1〕将子类中声明的成员变量做为子类对象的成员变量。5.3子类对象的构造过程〔2〕父类的成员变量也都分配了内存空间,但只将其中一局部〔继承的那局部〕做为子类对象的成员变量。 父类的private成员变量尽管分配了内存空间,但它不作为子类的成员变量,即父类的私有成员不归子类管理。5.3子类对象的构造过程子类对象内存示意图如以下图

子类未继承的成员

子类未继承的成员

引用子类对象

子类继承的成员

子类继承的成员

子类声明的成员

子类声明的成员5.3子类对象的构造过程上页示意图中的“叉号〞表示子类中声明定义的方法不可以操作这些内存单元,“对号〞表示子类中声明定义的方法可以操作这些内存单元。 通过上图,给我们有感觉好象:子类创立对象时似乎浪费了一些内存,因为当用子类创立对象时,父类的成员变量也都分配了内存空间,但只将其中一局部做为子类对象的成员变量’ 我们需注意到,子类中还有一局部方法是从父类继承的,这局部方法却可以操作这局部变量。下面的例子中,子类对象调用继承的方法操作这些未被子类继承却分配了内存空间的变量。5.4成员变量的隐藏和方法的重写

1.成员变量的隐藏子类可以隐藏继承的成员变量,当在子类中定义和父类中同名的成员变量时,子类就隐藏了继承的成员变量。 下面我们看一个例子,在这个例子中子类隐藏了从父类继承的double型变量。该程序的运行结果如下:

5.4成员变量的隐藏和方法的重写

2.方法重写子类也可以隐藏方法,子类通过方法重写来隐藏继承的方法。

方法重写是指:子类中定义一个方法,并且这个方法的名字、返回类型、参数个数和类型与从父类继承的方法完全相同。 子类通过方法的重写可以把父类的状态和行为改变为自身的状态和行为。

下面这个例子可以帮助我们更好的理解方法的重写。5.4成员变量的隐藏和方法的重写

需要注意的是:

方法重写时一定要保证方法的名字、类型、参数个数和类型同父类的某个方法完全相同,只有这样,子类继承的这个方法才被隐藏。 如果子类在准备隐藏继承的方法时,参数个数或参数类型与父类的方法不尽相同,那实际上也没有隐藏继承的方法,这时子类就出现两个方法具有相同的名字。下面我们看个例子。程序的运行结果如右图:5.5Super关键字

Super关键字有两种用法:一种用法是子类使用super调用父类的构造方法,另一种用法是子类使用super调用被子类隐藏的成员变量和方法。5.5Super关键字1.使用super调用父类的构造方法

子类不继承父类的构造方法; 因此,子类如果想使用父类的构造方法,必须在子类的构造方法中使用并且必须使用关键字super来表示,而且super必须是子类构造方法中的第一条语句。 在下面的例子中,子类的构造方法中使用super调用父类的构造方法。5.5Super关键字

2.使用super操作被隐藏的成员变量和方法

当子类中定义了一个方法,并且这个方法的名字、返回类型、参数个数和类型和父类的某个方法完全相同时,子类从父类继承的这个方法将被隐藏。 如果我们在子类中想使用被子类隐藏的成员变量或方法就可以使用关键字super。在下面这个例子中,子类使用super调用被隐藏的成员变量和方法。其结果如下:5.6final类和final方法final类不能被继承,即不能有子类,如:finalclassA{…}将一个类声明为final类一般是由于平安性考虑。

一旦一个方法被修饰为final方法,那么这个方法不能被重写,即不允许子类通过重写隐藏继承的final方法。5.7对象的上转型对象1.对象的上转型下面我们就介绍对象的上转型对象。假设,B是A的子类或间接子类,当我们用子类B创立一个对象,并把这个对象的引用放到A类声明的对象变量中时,比方:Aa;a=newB(); 那么就称对象a是子类对象b的上转型对象5.7对象的上转型对象 对象a是子类对象b的上转型对象,对象的上转型对象的实体是子类对象实体,但上转型对象会失去子类对象的一些属性和功能。上转型对象具有如下特点〔见以下图所示〕。子类对象子类对象的上转型对象继承或隐藏的成员变量继承或重写的方法新增的变量新增的方法5.7对象的上转型对象 可以将对象的上转型对象再强制转换到一个子类对象,这时,该子类对象又具备了子类所有属性和功能。为了更好的理解对象的上转型,我们先看个例子。

5.8继承与多态和继承有关的多态性是指父类的某个方法被其子类重写时,可以产生自己的功能行为,即同一个操作被不同类型对象调用时可能产生不同的行为。 例如,狗和猫都具有哺乳类的功能:“叫声〞,当狗操作“叫声〞时产生的声音是“汪汪…,而猫操作“叫声〞时产生的声音是“喵喵〞,这就是“叫声〞的多态。当一个类有很多子类时,并且这些子类都重写了父类中的某个方法。 当我们把子类创立的对象的引用放到一个父类的对象中时,就得到了该对象的一个上转型对象,那么这个上转型对象在调用这个方法时就可能具有多种形态。5.8继承与多态 因为不同的子类在重写父类的方法时可能产生不同的行为。也就是说,不同对象的上转型对象调用同一方法可能产生不同的行为。下面让我们看一个例子来更好地了解继承与多态和对象的上转型对象。程序的运行结果如以下图:返回5.9使用abstract类用关键字abstract修饰类称为abstract类〔抽象类〕。如:abstractclassA{……}abstract类不能用new运算符创立对象,必须产生其子类,由子类创立对象。 假设abstract类的类体中有abstract方法,只允许声明,而不允许实现,而该类的子类必须实现abstract方法,即重写父类的abstract方法。 一个abstract类只关心子类是否具有某种功能,不关心功能的具体实现。具体实现由子类负责。下面我们看一个例子:5.9使用abstract类 我们可以看到:圆锥、梯形为底的锥; 假设我们不用geometry类和对象的上转型对象,这里我们至少要使用两个构造方法。 这里是只涉及圆锥和梯形锥,假设是在有其它很多种形式的锥,这里的工作的量将非常大,这就是我们为什么使用abstract类和对象的上转型对象。 当然当我们学习接口后我们还可以使用接口实现这种功能。这在后面将详细介绍。5.10接口Java不支持多继承性,即一个类只能有一个父类。单继承性使得Java简单,易于管理程序。为了克服单继承的缺点,Java使用了接口,一个类可以实现多个接口。使用关键字interface来定义一个接口。接口的定义和类的定义很相似,分为接口的声明和接口体。1.接口的声明与使用〔1〕接口通过使用关键字interface来声明,格式:interface接口的名字5.10接口〔2〕接口体接口体中包含常量定义和方法定义两局部。接口体中只进行方法的声明,不许提供方法的实现,所以,方法的定义没有方法体,且用分号“;〞结尾。〔3〕接口的使用一个类通过使用关键字implements声明自己实现一个或多个接口。如果实现多个接口,用逗号隔开接口名,如:classAimplementsPrintable,Addable5.10接口

如果一个类实现某个接口,那么这个类必须实现该接口的所有方法,即为这些方法提供方法体。 要注意的是,接口中的方法被默认是public和abstract的,接口在声明方法时可以省略方法前面的public和abstract关键字,但是,类在实现接口方法时,一定要用public来修饰。 接口也可以被继承,即可以通过关键字extends声明一个接口是另一个接口的子接口。现在我们看一个例子来看一看类是如何实现接口的。5.10接口2.接口与多态的优势接口的语法规那么很容易记住,但真正理解接口更重要。 为什么要用接口呢?假设轿车、拖拉机、客车都是机动车的子类,其中机动车是一个抽象类。如果机动车中有3个抽象方法:“刹车〞、“收取费用〞、“调节温度〞,那么所有的子类都要实现这3个方法,产生各自的收费或控制温度的行为。 这显然不符合人们的思维方法,因为拖拉机可能不需要有“收取费用〞或“调节温度〞的功能; 可能的处理就是去掉机动车的“收取费用〞和“调节温度〞这两个方法。各个子类自己扩展。这样,高层次的抽象无法实现拉。5.10接口 Java支持继承,但不支持多继承,即一个类只能有一个父类。 单继承使得程序更加容易维护和健壮; 多继承使得编程更加灵活,但使用不当会引起混乱. 为了使程序容易维护和健壮,且不失灵活性,Java使用了接口,一个类可以实现多个接口,接口可以增加很多类都需要实现的功能,不同的类可以使用相同的接口,同一个类也可以实现多个接口。 3个抽象方法:“刹车〞、“收取费用〞、“调节温度〞:两个接口:收取费用〞、“调节温度〞接口和“刹车〞接口;5.11接口的回调在讲述继承与多态时,我们通过子类对象的上转型表达了继承的多态性,即把子类创立的对象的引用放到一个父类的对象中时,得到该对象的一个上转型对象,那么这个上转型对象在调用方法时就可能具有多种形态, 不同对象的上转型对象调用同一方法可能产生不同的行为。1.接口回调接口回调是多态的另一种表达,接口回调是指: 可以把使用某一接口的类创立的对象的引用赋给该接口声明的接口变量中; 那么该接口变量就可以调用被类实现的接口中的方法; 当接口变量调用被类实现的接口中的方法时,就是通知相应的对象调用接口中的相应方法,这一过程称作对象功能的接口回调。5.11接口的回调不同的类在使用同一接口时,可能具有不同的功能表达,即接口的方法体不必相同,因此,接口回调可能产生不同的行为。下面我们看看使用了接口的回调技术的例子。2.接口做参数当一个方法的参数是一个接口类型时,如果一个类实现了该接口,那么,就可以把该类的实例的引用传值给该参数,参数可以回调类实现的接口方法。下面我们再看一个接口做参数的例子。

5.12内部类

我们已经知道:类可以有两种重要的成员:成员变量和方法,类还可以有一种成员:内部类。 Java支持在一个类中声明另一个类,这样的类称作内部类,而包含内部类的类成为内部类的外嵌类。 内部类同类中声明的方法或成员变量一样,一个类把内部类看作是自己的成员。内部类中的也可以调用外嵌类的成员变量,方法

外嵌类可以声明内部类对象,作为外嵌类的成员。下面让我们结合这个例子更好的了解内部类。5.13匿名类1.和类有关的匿名类当使用类创立对象时,程序允许我们把类体与对象的创立组合在一起;new类名(){类体} 该类体被认为是某类的一个子类去掉类声明后的类体,称作匿名类。 匿名类就是一个子类,由于无名可用,所以不可能用匿名类声明对象,但却可以直接用匿名类创立一个对象。假设Hello是类,那么以下代码就是用Hello的一个子类〔匿名类〕创立对象:5.13匿名类newHello(){匿名类的类体}匿名类可以继承类的方法也可以重写类的方法。匿名类可以访问外嵌类中的成员。 匿名类的主要用途就是作为实参向方法的形参传递对象引用。下面的例子展示了匿名类的用法。 我们使用匿名类时,必然是在某个类中直接用匿名类创立对象,因此匿名类一定是内部类。5.13匿名类2.和接口有关的匿名类假设Computable是一个接口,那么,Java允许直接用接口名和一个类体创立一个匿名对象,此类体被认为是实现了Computable接口的类去掉类声明后的类体,称作匿名类。 以下代码就是用实现了Computable接口的类〔匿名类〕创立对象:newComputable(){实现接口的匿名类的类体}5.13匿名类如果某个方法的参数是接口类型,那么我们可以使用接口名和类体组合创立一个匿名对象作为实参传递给方法的形参,类体必须要实现接口中的全部方法。下面的例子16展示了和接口有关的匿名类的用法。

5.14异常类所谓异常就是程序运行时可能出现一些错误,比方试图翻开一个根本不存在的文件等,异常处理将会改变程序的控制流程,让程序有时机对错误作出处理。 将可能出现的异常操作放在try~catch语句的try局部,当try局部中的某个语句发生异常后,try局部将立刻结束执行,而转向执行相应的catch局部。5.14异常类所以程序可以将发生异常后的处理放在catch局部。1.try~catch语句try~catch语句的格式如下:try{包含可能发生异常的语句}catch(ExceptionSubClass1e){}5.14异常类catch(ExceptionSubClass2e){}各个catch参数中的异常类都是Exception的某个子类,说明try局部可能发生的异常。下面我们看一个例子,在这个例子中,我们试图将一个非数字字符转变成整形数,这时就发生NumberFormatException异常。5.14异常类2.自定义异常类1〕我们也可以扩展Exception类定义自己的异常类,然后规定哪些方法抛出这样的异常。 2〕一个方法在声明时可以使用throws关键字声明抛出所要产生的假设干个异常,并在该方法的方法体中具体给出产生异常的操作,即用相应的异常类创立对象; 这样在方法结束执行并抛出所创立的异常对象。 3〕程序必须在try语句中调用抛出异常的方法。

5.14异常类在下面例子

温馨提示

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

评论

0/150

提交评论