继承
| 导航 类和对象 主题: |
继承是 面向对象编程 最强大的机制之一。它允许在另一个类(称为子类、子类或派生类)中重用一个类(称为超类或母类)的成员,该类继承自它。这样,类可以通过继承依次构建。
在 Java 中,这种机制是由extends关键字启用的。示例
代码清单 4.9:Vehicle.java
public class Vehicle {
public int speed;
public int numberOfSeats;
}
|
代码清单 4.10:Car.java
public class Car extends Vehicle {
public Car() {
this.speed = 90;
this.numberOfSeats = 5;
}
}
|
在代码清单 4.10中,类Car继承自Vehicle,这意味着属性speed和numberOfSeats存在于类Car中,而它们是在类Vehicle中定义的。此外,在类Car中定义的构造函数允许初始化这些属性。在 Java 中,继承机制允许定义具有所有类的类层次结构。如果没有显式继承,类会隐式地继承自Object类。这个Object类是类层次结构的根。
某些类不能继承。这些类是用final关键字定义的。例如,Integer类不能有子类。它被称为最终类。
在实例化时,子类会接收从其超类继承的特征,该超类也从其自己的超类继承了特征,依此类推,直到Object类。这种机制允许定义可重用的全局类,其用户在派生的更具体的类中详细说明行为。
在 Java 中,一个类只能继承自一个类。Java 不允许你从两个类创建子类,因为这将需要创建复杂的规则来消除从多个超类继承的字段和方法的歧义。如果 Java 需要从多个来源继承,最好的选择是通过接口,在下一章中介绍。
super关键字允许访问类的超类的成员,就像你可以使用this访问当前类的成员一样。示例
代码清单 4.11:Plane.java
public class Plane extends Vehicle {
public Plane() {
super();
}
}
|
在这个例子中,Plane类的构造函数调用了其超类Vehicle的构造函数。你只能使用super访问子类内部超类的成员。如果你从另一个类使用它,它会访问另一个类的超类。这个关键字还允许你显式地访问超类的成员,例如,在你的类中存在同名方法的情况下(覆盖,...)。示例
代码清单 4.12:Vehicle.java
public class Vehicle {
// ...
public void run() throws Exception {
position += speed;
}
}
|
代码清单 4.13:Plane.java
public class Plane extends Vehicle {
// ...
public void run() throws Exception {
if (0 < height) {
throw new Exception("A plane can't run in flight.");
} else {
super.run();
}
}
}
|
问题 4.1:考虑以下类。
问题 4.1:Class1.java
public class Class1 {
public static final int CONSTANT_OF_CLASS_1 = 9;
public int myAttributeOfClass1 = 40;
public void myMethodOfClass1(int i) {
}
}
|
问题 4.1:Class2.java
public class Class2 extends Class1 {
public int myAttributeOfClass2 = 10;
public void myMethodOfClass2(int i) {
}
}
|
问题 4.1:Class3.java
public class Class3 {
public static final int CONSTANT_OF_CLASS_3 = 9;
public void myMethodOfClass3(int i) {
}
}
|
问题 4.1:Question1.java
public class Question1 extends Class2 {
public static final int CONSTANT = 2;
public int myAttribute = 20;
public void myMethod(int i) {
}
}
|
列出可以在类Question1中访问的所有属性和方法。
CONSTANT_OF_CLASS_1myAttributeOfClass1myMethodOfClass1(int)myAttributeOfClass2myMethodOfClass2(int)CONSTANTmyAttributemyMethod(int)
Question1继承自Class1和Class2,但不继承自Class3。
- 另请参阅有关继承概念的面向对象编程书籍。