继 承
辽宁经济职业技术学院信息系
硕士、副教授 陈英
继承的定义
继承的思想就是允许在已经存在的类上建
立新的类。
若继承一个已经存在的类时,那么就复用
(继承)那个类的方法和字段。同时还可
以在新类中增添新的方法和字段已适应新
的环境。
继承对于 java编程来说是非常优秀和重要
的。
扩展类 ——经理类
在编程中,常常要创建某件事的模型(如:一个职
员),然后需要一个该基本模型的更专业化的版本。
以前面的 Employee类为例。 比如,可能需要一个经
理的模型。显然经理实际上是一个职员,只是一个
带有附加特征的职员。
Employee类
public class Employee {
String name;
Date hireDate;
Date dateOfBirth;
}
经理类
public class Manager{
String name;
Date hireDate;
Date dateOfBirth;
String jobTitle;
int grade;
...}
扩展类 ——经理类
这个例子阐述了在 Manager和 Employee
类之间的数据复制 。
在 Manager和 Employee类之间有一个明
显的, is-a” 关系 。 每个经理都是一个员
工:, is-a”就是继承的特点 。
此外, 还可能有许多适用于 Employee和
Manager两者的方法 。 因此, 需要有一
种办法从现有类来创建一个新类 。 这就
叫做子类 。
“is-a” 关系
继承是否为正确的设计可以用一个简单的规则
来判断:,is-a” 规则表明子类的每一个对象
都是一个超类的对象。
例如,每一个经理是一个员工。然而,只有
Manager类是 Employee的子类才是有意义的。
很明显,反过来就不行了。并不是每个员工都
是经理。
,is-a” 规则的替代原则:无论何时,如果程
序需要一个超类对象,都可以用一个子类的对
象来代替。
关键 字 —— Extends
在面向对象的语言中,提供了特殊的机制,允
许程序员用以前定义的类来定义一个类。如下
所示,可用关键字 extends来实现
public class Manager extends Employee {
String department;
Employee [] subordinates;
}
在这样的安排中,Manager类被定义,具有
Employee 所拥有的所有变量及方法。所有这
些变量和方法都是从父类的定义中继承来的。
所有的程序员需要做的是定义额外特征或规定
将适用的变化。
关键 字 —— Extends
关键字 extends 说明了要构建一个新类而该类
是从一个已经在的类中衍生而出。
已存在的类叫做超类、基类或者父类 ;而新类称
作子类或者派生类。
术语超类和子类在 java语言中表示继承,而在
其它语言中更习惯于父 /子类的叫法。但它们都
表示继承。
尽管 Employee类是一个超类,但是并不因为它
是它的子类的超类就意味着它有更多的功能。
恰恰相反,子类比它们的超类具有更多的功能。
继承的意义
这种方法是在维护和可靠性方面的一个伟大
进步。如果在 Employee类中进行修改,那么,
Manager类就会自动修改,而不需要程序员做
任何工作,除了对它进行编译。
当浏览探索一个 ( 子 ) 类的时候, 一定要检
查父类和其它祖先类中的继承成员 。
当通过一个超类来定义一个子类时,只需说
明子类与超类的区别可以了。
在设计类时,应该把最通用的方法放进超类
中,而更专门的方法应该放在子类中。
单继承性
当一个类从一个唯一的类继承时,被称做
单继承性。单继承性使代码更可靠。
Java编程语言允许一个类仅能扩展成一个
其它类。这个限制被称做单继承性。
Java编程语言加强了单继承性限制而使代
码更为可靠,尽管这样有时会增加程序员
的工作。
Java不支持多重继承。
Employee继承层次图
雇员
经理 秘书 程序员
总裁
1,可以进行多层次继承,如上图所示。
2,从一个通用超类扩展的所有类的集合称作一个
继承层次图。
3,层次图中的从一个特殊类到该类祖先的路径称
作该类的继承链。
4,通常一个祖先类有不止一个子孙继承链。
继承层次图
Employee
attributes
name
address
salary
methods
up_salary
promote
Engineer
Secretary
Manager
attributes
bonus
methods
up_bonus
attributes
car allowance
methods
up_ allowance
promote
Director
构造函数不能被继承
尽管一个子类从父类继承所有的方法和变
量,但它不继承构造函数,掌握这一点很
重要。
一个类能得到构造函数,只有两个办法:
1) 写构造函数。
2) 利用类自有的一个缺省构造函数。
继承的多态性
经理类具有父类职员类的所有数据和方法。
这就是说,任何在 Employee上的合法操作
在 Manager上也合法。如果 Employee 有
raiseSalary() 方法,那么 Manager 类也有。
在 java中,对象变量是多态的。 有能力拥
有许多不同的格式,就叫做多态性。
既然变量能指向不同格式的对象,那么变
量就是多态性的。
多态性实例分析
一个 Employee类型即可以是 Employee对象类型,也可
以是 Employee类的任何子类(如 Manager,Secretary、
Engineer以及 Director等等)的对象类型。例:
Employee[] staff = new Employee[3];
staff[0] = boss;
staff[1] = new Employee("Harry Hacker",
50000,1989,10,1);
staff[2] = new Employee("Tommy Tester",
40000,1990,3,15);
for (int i = 0; i < staff.length; i++) {
Employee e = staff[i];
System.out.println("name=" + e.getName()
+ ",salary=" + e.getSalary()); }
多态性实例分析
当 e 指向一个 Employee对象时,e.getSalary()
会调用 Employee类中的 getSalary()方法;而
当 e 指向一个 Manager对象时,getSalary()方
法就变成了 Manager类中的 getSalary()方法;
虚拟机知道 e所指对象的实际类型,因此它会
调用正确的方法。
事实上,一个对象变量(如 e)可以指向多种
实际类型的这种现象称为多态。在运行时自
动选择正确的方法进行调用称作动态绑定。
关键字 —— super
关键字 super可被用来引用该类中的超类。
它被用来引用超类的成员变量或方法。
super.method()格式的调用,如果对象已经
具有父类类型,那么它的方法的整个行为
都将被调用。该方法不必在父类中定义。
它也可以从某些祖先类中继承。
关键字 —— super
子类可以添加字段,也可以添加方法或者
重载超类中的方法。
继承不能去除超类中的任何字段和方法。
例,super(n,s,year,month,day);的意思是
“调用 Employee超类的构造器,同时带有
m,year,month以及 day参数”
public Manager(String n,double s,
int year,int month,int day) {
super(n,s,year,month,day);
bonus = 0; }
关键字 —— super
既然 Manager中构造器不能访问 Employee
的私有变量,那么它必须通过一个构造器
来初始化它们。
这个构造器通过专门的 super语法来调用。
使用 super的调用必须是子类构造器中的第
一行语句。
如果子类构造器不明显地调用父类中的构
造器,那么超类使用默认 (无参数 )构造器。