Java 程序设计:类的继承和派生
继承是 Java 程序设计中的一种重要机制,它使得软件的代码可以得到重用和扩展。通过继承,新的类可以吸收已有类的数据属性和行为,并增加新功能或修改已有功能来创建新类。
继承的概念和软件的重用性
继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力。类和类之间的继承关系可以用 UML 符号表示,如图 5-1 所示,父类又叫超类或基类,子类又叫派生类。父类是子类的一般化,子类是父类的特化(具体化)。
继承的优点是可以使软件的代码得到重用,节省了程序的开发时间,并促进了经过验证和调试的高质量软件的重用,这增加实现系统的效率。在 Java 中,Object 类定义和实现了 Java 系统所需要的众多类的共同行为,是所有类的根类,所有的类都是由这个类继承、扩充而来的。
派生类的定义
派生类(子类)定义的一般格式为:
[ 类修饰符 ] class 子类名 extends 父类名 {
成员变量定义;
成员方法定义;
}
派生类的定义中,用关键字 extends 来明确指出它所继承的超类。定义一个类时,如果没有显示使用 extends 关键字,则该类的直接父类为 Java.lang.Object 类。
在 Java 中,Object 类是除自身以外的其他所有类的直接或间接父类。例如,通过继承来定义派生类,如例 5-1 所示:
```java
class Automobile{
int Number;
void setNumber(int Num){
Number=Num;
}
void showNumber(){
System.out.println("Automobile number:"+Number);
}
}
class Truck extends Automobile{
int capacity;
void setCapacity(int truckCapacity){
capacity=truckCapacity;
}
void showCapacity(){
System.out.println("Truck Capacity:"+capacity);
}
}
class AutomobileExtends{
public static void main(String args[]){
Truck tc=new Truck();
tc.setNumber(8888);// 派生类使用从超类中继承的方法 setNumber
tc.setCapacity(10);
tc.showNumber();// 派生类使用从超类中继承的方法 showNumber
tc.showCapacity();
}
}
```
在上面的例子中,汽车类 Automobile 为父类,卡车类 Truck 为子类。Automobile 类定义了所有汽车具有的共同属性——牌照(Number),和领取牌照(setNumber)、显示牌照(showNumber)的两个方法。Truck 类继承自 Automobile 类,并增加了自己的属性 capacity 和方法 setCapacity、showCapacity。
访问修饰符 protected
在继承关系中,子类可以访问父类的成员变量和成员方法,但是这取决于父类成员的访问修饰符。如果父类的成员变量或成员方法的访问修饰符为 protected,则子类可以访问该成员变量或成员方法。
方法的重写
在继承关系中,子类可以重写父类的成员方法,以便实现自己的行为。方法的重写可以使子类具有更加特殊化的行为。
继承下的构造函数的使用
在继承关系中,子类的构造函数可以调用父类的构造函数,以便实现父类的初始化。子类的构造函数可以使用 super 关键字来调用父类的构造函数。
继承下的 finalize 方法的使用
在继承关系中,子类的 finalize 方法可以调用父类的 finalize 方法,以便实现父类的垃圾回收。子类的 finalize 方法可以使用 super 关键字来调用父类的 finalize 方法。
超类和子类的关系
在继承关系中,超类是子类的一般化,子类是父类的特化(具体化)。子类可以看做超类的一个特例。子类的对象可当作超类对象,但反过来,不能把超类对象当作子类对象。
继承的分类
继承可以分为单继承和多继承。单继承是指一个子类最多只能有一个父类。多继承是一个子类可有二个以上的父类。Java 类只支持单继承,而接口支持多继承。