实验9继承与多态(抽象类和接口)

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验9 继承与多态

、实验目的

(1) 理解类的继承,掌握变量隐藏、方法覆盖的概念。

(2 )理解引用类型的变量的赋值转换原则。

(3 )理解多态概念,掌握方法的匹配调用原则;

(4 )理解抽象类的使用;

(5 )理解this 和super 的含义及使用。

(6 )理解访问控制符的使用

二、知识要点

1、继承的概念

通过类的继承,祖先类的所有成员均将成为子类拥有的“财富”。但是能否通过子类对象直接访问这些成员则取决于访问权限设置。Object 类是所有类的祖先。

2、构造方法与继承关系构造方法不存在继承关系,子类中是如何给父类继承的属性赋初值呢?子类通过调用父类的构造方法给父类的属性赋值,在子类的构造方法的第1 行可以通过super 去调用父类的构造方法,如果没有super 调用,则默认调用父类的无参构造方法。所以,在父类中编写构造方法通常均要提供无参构造方法。

3、对象引用变量赋值原则可以将子类的对象引用赋值给父类引用变量,由于父类能操作访问属性和方法的子类已全部继承。但将父类引用变量的值赋给子类引用变量就受到限制,必须进行强制转换,编译总是认可强制转换,但运行程序时如果不能正确转换就会报错。

4、多态的两种表现形式

( 1) 同一类中的方法多态(方法重载):同一类中允许多个同名方法,通过参数的数量、类型的差异进行区分。

( 2) 子类对父类方法的重新定义 (方法覆盖) :方法名、返回值和参数形态完全一样。 ( 3) 方法调用的匹配原则。

首先查找有否有参数一致的方法,也就是精确匹配;如果没有,再检查实参是否能自动转换为形参类型,能转换也可以匹配调用,这种匹配称为转换匹配。

5、继承关系中对成员的访问(最近匹配原则) 由于继承关系的存在,一个对象的属性和方法中有自己新定义的,也有从祖先类继承的。允许子类对父类定义的属性和方法重新定义,一个对象查找其属性和方法时按什么原则查找呢,实际也是“最近匹配原则”。

(1)在子类中访问属性和方法时将优先查找自己定义的属性和方法。如果该成员在本

类存在,则使用本类的,否则,按照继承层次的顺序到其祖先类查找,如图8-1所示。

(2)this关键字特指本类的对象引用,使用this访问成员则首先在本类中查找,如果没有,则到父类逐层向上找。

(3)super特指访问父类的成员,使用super首先到直接父类查找匹配成员,如果未找到,再逐层向上到祖先类查找。

1

6、抽象类

定义形式:

abstract class 类名称{

成员变量;

方法(){……} II定义一般方法

abstract 方法();II定义抽象方法

}

在抽象类中可以包含一般方法和抽象方法。

抽象类表示的是一个抽象概念,不能被实例化为对象。

继承抽象类的具体类必须将抽象类中抽象方法覆盖实现。

7、接口

定义形式:

in terface 名称{

静态常量;

抽象方法();

}

接口中包含静态常量和抽象方法.

类继承接口,实现接口中的所有方法.

三、上机练习

Area、两个Area类的派生子类RectArea和

1.编写程序,在程序中定义一个抽象类

RoundArea 类,以及一个实现类 ImpleArea 类(main 方法所在的类).程序的实现如下:

(1) 抽象类Area 类中只包含一个抽象方法: double area ()。

(2) 子类RoundArea 类通过覆盖父类中的抽象方法 area 来求圆的面积,另一个类

RectArea 类通过覆盖父类中的抽象方法 area 求长方形的面积

(3) 圆的半径和长方形的边分别定义为子类 RoundArea 类和RectArea 类的域,都为

double 类型。

(4) ImpleArea 类中接收键盘输入(Scann er ),输入内容分别为长方形的边和圆的 半径,求出

长方形和圆的面积,并在屏幕上显示。

2.某公司有3种不同的雇员,分为 A ,B ,C3个级别。公司的总雇员数目因月份的不同可 能发生变化。每个

级别的月薪是不同的。编写一个程序计算公司一个月需要支付的全部 薪水。

要求有一个 abstract 类,类名为 Employee 。 Employee 的子类有 Aemployee, Bemployee,

Cemployee. Employee 类必须有一个 abstract 方法

注意:Aemployee, Bemployee, Cemployee 声明的对象表示的是一个员工,而不是一类员 工。成员变量没有要求的,不能乱加。

public abstract double earnings ();〃 返回级另U 工资

子类必须重写父类的 earnings 方法(必须的,继承抽象类必须实现抽象方法),给出各 自的月薪水的具体数额。 (数据随便,自己编好了)

编写一个Company 类,该类用 Employee 数组作为成员,Employee 数组的单元可以是 Aemployee, Bemployee, Cemployee 的子类对象。 Company 类提供计算月薪总和的方法, 使得程序能输出

Company 对象需要支付的月薪总额。

编写一个类,来检验该Company.要求不同等级员工的人数由用户来决定 (使用Scanner 类)。根据人数,来求出该月公司支付月薪对象

程序效果如图:

3.火车要装载一批货物和乘客,货物由3种商品:电视、计算机和洗衣机组成。 火车需要计算出所装载的货物和乘客的总重量。

要求:有一个 SetAndGetWeight 接口,该接口中有 2个方法:

public double getWeight ();

public void setWeight (double weight );

有四个实现该接口的类:Television 、Computer 、WashMachine 、People 类。 这四个类通过实现接口设置各对象的自重和获取对象的自重。

有一个Train 类,该类用SetAndGetWeight 接口类型的数组作为成员,那么 该数组的单元就可以存放 Television 、Computer 、WashMachine People 对象的 引用。程序能输出Train 对象所装载的货物和乘客的总重量。0 5 5 112 雇雇£

拔级级tK fi B c 娄才y 司司司an 公公公总月s 入入入司司es 了諭公公pl* t- y e k-

相关文档
最新文档