(4) 实验四 继承与多态.doc_第1页
(4) 实验四 继承与多态.doc_第2页
(4) 实验四 继承与多态.doc_第3页
(4) 实验四 继承与多态.doc_第4页
全文预览已结束

下载本文档

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

文档简介

实验四:继承与多态一、 实验类型验证型二、 实验目的1 理解继承的概念、机制、原理和作用,掌握Java中继承的方式和使用方法。2 在继承的基础上理解多态的概念,掌握Java中多态的实现方法。3 掌握成员变量的隐藏、方法重写和对象的向上转型三、 实验内容(一) 继承继承是一种使用已有类创建新类的机制,是面向对象编程的重要特征之一。继承的作用在于“重用”,继承产生的“子类”,可以“继承”原有的父类的代码(状态和行为),也可以很容易的扩展或改变代码。(1)类的继承Java语言使用extends关键字在两个类之间建立这种类似与父子血缘关系的“继承”关系:在定义类时,使用extends来指明它的父类。值得注意的是,Java中的继承只能是单继承即单根继承。语法格式:class SubClass extens SuperClass /只能有一个父类如果一个类没有显式指明父类,那么这个类默认是java.lang.Object类的子类。由于继承可以被向下传递(子类继承于父类的状态和行为,可以被子类的子类所“继承”),因此java中的所有类都直接或间接的是java.lang.Object类的子类。这样继承也使得类出现了层次关系,这种组织结构称为类的层次。实验1:编写一个Java程序,定义Person类以及该类的一个子类Student,满足以下UML类图的描述,并编写测试类TestClass,尝试使用Student对象以继承的方式使用父类Person类的成员。Person- name : String+ Person();+ Person(name : String)+ getName():String+ void setName(name:String)Student- deparment : String+ Student()+ Student(department:String)+ getDepartment():Stirng+ void setDepartment(department:String)请给出源代码和运行结果,并回答如下问题:1)子类能否“继承”父类的所有成员么?(提示:构造、访问限制、static、final)2)如果给Student创建一个子类GoodStudent类,这个类能否继承Person类,直接使用来自Person类的成员?(2)继承的实现Java中子类通过继承可以调用父类的成员,是通过创建父类对象的方式来实现的。即构建子类对象时,会创建一个父类对象来引用父类成员。默认的,子类会调用父类的无参的构造方法来构建父类对象并对父类对象的成员进行初始化,也可以通过super关键字类指明调用哪个父类构造。实验2:阅读、补全以下代码,并尝试运行,给出运行结果和分析。class Aprivate int x;static System.out.println(“ static statement from A!”);public A(int x) (a) = x; System.out.println(“a A Object is Created!”);public void fA()System.out.println(“method fA() from class A!”);System.out.println(“x is ”+ x);class B extends Aprivate int x;static (b) ;/输出static statement from B!public B() (c) ; /调用B(int)构造方法。public B(int x) (d) ; /调用父类的构造方法,参数为2*x; this.x = x;System.out.println(“a B Object is Created!”);public void fB()System.out.println(“method fB() from class B!”);fA();System.out.println(“x is ”+ x);public class Testpublic static void main(String args)B b;System.out.println(“=类已加载完毕=”);b = new B(10);b.fB();问题:1)请结合运行结果分析Java中创建对象过程。(分析类的不同区域的运行前后次序,提示:类加载时或创建对象时,父类静态成员、实例成员、构造方法和子类静态成员、实例成员、构造方法的执行先后次序)2)什么时候需要使用super语句来显式调用父类构造? (二) 多态多态是面向对象编程的重要技巧,它也是面向对象的重要特征之一。多态的本意是“同一个操作,不同的行为”,也就是使用同一个方法名,运行的实际是不同的方法。在Java语言中,多态主要通过方法的重载(Overloading)和重写(Overriding)实现。(1)方法的重载重载是指在一个类中,由于多个方法的方法名重名,但是各自参数的个数和参数类型不同的情况下,发生的方法调用。重载遵循的原则:1方法名一定要相同。不同的方法名,就是不同的方法,不构成重载2传入的参数列表一定要不同。Java会根据参数类型和个数来判断是调用的那一个方法。3方法重载与返回值无关。方法签名:为了区别不同的方法,判断是否存在重载,通常使用方法签名来进行识别。方法签名为:方法名(参数类型列表)方法的重载带来的这种多态,在编译期,Java虚拟机根据对象类型、方法名称、参数类型和个数可以确定调用的是那一个方法,所以称为编译时多态、或静态绑定。实验3:在类Adder中定义三个方法处理不同的参数情况,具体方法签名声明如下:1) int add(int,int):计算两个整数相加的和 2) double add(int,int):计算两个整数相加的和3) int add(int ,int , int):计算三个整数相加的和4) double add(double):计算一个数组的数相加的和,请给出源代码和测试类的代码,说明重载的判断方法,以上方法中是否存在不属于重载的情况,并说明这种情况应该称为什么?(2)方法的重写通过继承,子类可以直接继承父类中可被子类访问的成员方法,同时子类也可根据需要去重写父类的方法,来改变或扩展父类的功能,使得同一个方法在不同的子类中有不同的行为。子类中的方法与父类中的方法名相同时,就称为子类的方法重写了父类的方法。重写遵守的原则:1方法名称要一致。2返回类型要一致。不同,就是重载而不是重写。3参数列表要一致。4修饰符的访问权限,只能升高,不能降低。实验4:编写一个Animal类,它有Dog,Cat,Bird三个子类,这三个子类都重写了父类Animal的move和cry方法,请给出源代码和测试代码,并回答问题。提示:使用打印语句完成方法的内容。如Bird的move方法输出“我有翅膀,我能飞翔!”;问题:如何判断子类是否重写了父类方法?(提示:分为两步)(3)重写与向上转型方法的重写所产生的多态,一般结合向上转型来使用。使用父类类型来接收一个子类对象,即将子类对象看成是父类对象,我们称为向上转型,相反为向下转型(强制转型)。向上转型后的对象引用,尽管实际为子类对象,但被作为父类看待,只能引用父类的成员。如果要使用子类的自己方法,必须向下转型。当程序运行并通过向上转型后的对象来调用方法时,Java会根据实际的对象类型来调用实际类型所对应的方法。这种运行时的多态,我们也成为动态绑定。实验5:使用向上转型改写实验4的测试代码,给出源代码并回答一下问题:问题: 使用对象向上转型的方式来调用方法时,能否调用子类特有的方法或变量?为什么?实验6:(*选作)阅读以下代码,调试并修正代码中的错误,对正确运行结果进行分析。class Q1 int i=10;public void method(int i)System.out.println(10);class Q2 extends Q1int i=20;public void method(int i)System.out.println(20);public void method2(int i) /新增方法System.out.println(30);public

温馨提示

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

评论

0/150

提交评论