第1节 类的继承
推荐给好友
打印
加入收藏
更新于2009-05-10 13:40:04

第七章 类的继承性

学习目标
理解类的继承性的概念
理解父类和子类的关系
掌握关键字super的用法
学会使用protected/final/abstract
创建抽象类

7.1 类的继承

类的继承
一种由已有的类创建新类的机制,是面向对象程序设计的基石之一通过继承,可以根据已有类来定义新类,新类拥有已有类的所有功能Java只支持类的单继承,每个子类只能有一个直接父类

7.1.1 继承的概念

继承
父类是所有子类的公共属性及方法的集合,子类则是父类的特殊化只需指明新类与现有类的不同,即增加自己的属性和方法即可继承介于类之间,而不是对象之间

7.1.1 继承的概念——基类和派生类

基类(base class)
也称超类(superclass)、父类
是被直接或间接继承的类
派生类(derived-class)
也称子类 (subclass)
继承其他类而得到的类
继承所有祖先的状态和行为
派生类可以增加变量和方法
派生类也可以覆盖(override)继承的方法

7.1.1 继承的概念——is_a关系

子类对象与父类对象存在“IS A”(或“is kind of”)的关系



7.1.1 继承的概念——图7_1



7.1.1 继承的概念——又一个例子



7.1.1 继承的概念——派生类对象

派生类产生的对象
从外部来看,它应该包括
与基类相同的接口
也许具有更多的方法和数据成员
其内包含着一个基类类型的子对象

7.1.1 继承的概念——继承的意义

继承的意义
采用继承的机制来组织、设计系统中的类,可以提高程序的抽象程度,使之更接近于人类的思维方式
采用继承编写的程序结构清晰,节省了编程时间,因为代码的编写量减少,因此也降低了维护的工作量

7.1.2 继承的语法

继承的语法
语法形式
class childClass extends parentClass
{ //类体}

说明
关键字extends说明要声明的类需要继承父类的属性和行为
parentClass是被继承的父类名称

7.1.2 继承的语法——派生类成员

派生类成员
继承基类声明为public 或protected 的成员
如果基类和派生类在同一个包中,派生类可以继承基类没有访问权限标志符的(缺省的)成员
如果派生类某成员名和基类某成员名同名,派生类同名变量成员隐藏基类成员,派生类同名方法成员覆盖基类成员

7.1.2 继承的语法(续)——例7_1

在一个公司中,有普通员工(Employees)及管理者(Managers)两类人员职员对象(Employees)可能有的属性信息包括
员工号(employeeNumber)
姓名(name)
地址(address)
电话号码(phoneNumber)
管理者(Managers)除具有普通员工的属性外,还可能具有下面的属性
职责(responsibilities)
所管理的职员(listOfEmployees)
可设计Employee及Manager两个类,将Manager类作为Employee类的子类

7.1.2 继承的语法(续)——例7_1


Employee与Manager的类图


7.1.2 继承的语法(续)——例7_1

//父类Employee
class Employee
{ int employeeNumbe ;
String name, address, phoneNumber ;}
//子类Manager
class Manager extends Employee
{ //子类增加的数据成员
String responsibilities, listOfEmployees;}

Manager不但继承了Employee的属性,还增加了自己的属性
一个对象从其所有的父类中继承属性及行为

7.1.2 继承的语法——公有(及保护)成员的继承

公有(及保护)成员的继承
子类的对象可以使用其父类中声明为公有(及保护)的属性和方法,就如同在其自己的类中声明一样

7.1.2 继承的语法

设有三个类:Person, Employee, Manager。其类层次如图:






运行结果



说明
子类能直接访问从父类中继承的公有/保护属性及方法,就如同自己在本类中定义的一样。

7.1.2 继承的语法——私有属性及行为的继承

私有成员的继承
子类不能直接访问从父类中继承的私有属性及方法,但可以使用公有(及保护)方法进行访问



编译结果及分析
对类A进行编译
系统会提示编译错误:“A.java:7: b has private access in B”
说明
b是从类B继承来的,由于b是私有属性,不能在A类中直接存取,但可以使用继承来的共有方法getB()取得

7.1.3 隐藏和覆盖

隐藏和覆盖
是指子类对从父类继承来的属性变量及方法可以重新加以定义

隐藏和覆盖(1)——属性的隐藏



属性的隐藏
子类对从父类继承来的属性变量重新加以定义,则从父类继承的属性将被隐藏子类拥有了两个相同名字的变量,一个继承自父类,另一个由自己声明当子类执行继承自父类的操作时,处理的是继承自父类的变量,而当子类执行它自己声明的方法时,所操作的就是它自己声明的变量,而把继承自父类的变量“隐藏”起来了
如何访问被隐藏的父类属性?
调用从父类继承的方法,则操作的是从父类继承的属性!
如何在子类中调用?

使用sup







子类对父类静态属性的继承?
子类不能继承父类中的静态属性,但可以对父类中的静态属性进行操作。如在上面的例子中,将“int x = 2;”改为“static int x = 2;”,再编译及运行程序,会得到下面的结果
4
super.x= 14 x= 100
14
super.x= 16 x= 100
16
16
在上面的结果中,第一行及最后一行都是语句“a1.printa();”输出的结果,显然类B中的printb()方法修改的是类A中的静态属性x

隐藏和覆盖(2)——方法覆盖
方法覆盖
如果子类不需使用从父类继承来的方法的功能,则可以声明自己的同名方法,称为方法覆盖
覆盖方法的返回类型,方法名称,参数的个数及类型必须和被覆盖的方法一模一样
只需在方法名前面使用不同的类名或不同类的对象名即可区分覆盖方法和被覆盖方法
覆盖方法的访问权限可以比被覆盖的宽松,但是不能更为严格

覆盖的应用场合
方法覆盖的应用场合
子类中实现与父类相同的功能,但采用不同的算法或公式
在名字相同的方法中,要做比父类更多的事情
在子类中需要取消从父类继承的方法

覆盖——方法覆盖的注意事项
必须覆盖的方法
派生类必须覆盖基类中的抽象的方法,否则派生类自身也成为抽象类.
不能覆盖的方法
基类中声明为final的终结方法
基类中声明为static 的静态方法

uper关键字
从Sub中访问Superclass的成员aNumber
super.aNumber

调用被覆盖的方法
super.overriddenMethod();





7.1.4 有继承时的构造方法

有继承时的构造方法遵循以下的原则

子类不能从父类继承构造方法
好的程序设计方法是在子类的构造方法中调用某一个父类构造方法,调用语句必须出现在子类构造方法的第一行,可使用super关键字如子类构造方法的声明中没有明确调用父类构造方法,则系统在执行子类的构造方法时会自动调用父类的缺省构造方法(即无参的构造方法)

有继承时的构造方法















练习练习!
在一个公司管理信息系统中,包括
普通员工(Employees),其可能有的属性信息包括
员工号(employeeNumber)
姓名(name)
地址(address)
电话号码(phoneNumber)
管理者(Magagers),除具有普通员工所具有的属性及行为外,还具有下面的属性和行为
职责(responsibilities)
所管理的职员(listOfEmployees)
工资的计算方法与一般员工不同;福利与一般员工不同
顾客(Customers),可能有的属性信息包括
姓名(name)
地址(address)
电话号码(phoneNumber)






上一节            下一节
相关链接


 
关于我们 | 诚邀加盟 | 客户服务 | 相关法律 | 网站地图 | 友情链接 | 服务信箱:service@eefocus.com
© 2006 与非门科技信息咨询(北京)有限公司 All Rights Reserved.