原文: https://javatutorial.net/java-inheritance-example

此示例演示了 Java 编程语言中继承的用法

什么是继承

继承是一种 OOP 功能,它允许 Java 类从其他类派生。 父类称为超类,而派生类称为子类。 子类从其超类继承字段和方法。

继承是面向对象编程(OOP)背后的四个主要概念之一。 OOP 问题在工作面试中很常见,因此您可能会在下一次 Java 工作面试中遇到有关继承的问题。

Java 中的“所有类的母亲”是Object类。 Java 中的每个类都继承自Object。 在层次结构的顶部,Object是所有类中最通用的。 层次结构底部附近的类提供了更特殊的行为。

Java 继承示例 - 图1

Java 平台中的所有类都是对象的后代(图像来自 Oracle

Java 具有单个继承模型,这意味着每个类都只有一个并且只有一个直接超类。

子类继承其父级的所有公共和受保护的成员,无论该子类位于哪个包中。如果该子类与其父级位于同一包中,则它也继承父成员的私有成员。 您可以按原样使用继承的成员,替换它们,隐藏它们,或用新成员补充它们:

  • 继承的字段可以像其他任何字段一样直接使用。
  • 您可以在子类中声明一个与超类中的名字相同的字段,因此隐藏了(不推荐)。
  • 您可以在子类中声明不在超类中的新字段。
  • 继承的方法可以直接使用。
  • 您可以在子类中编写一个新的实例方法,该方法具有与超类中的签名相同的签名,因此将覆盖。
  • 您可以在子类中编写一种新的静态方法,该方法具有与超类中的签名相同的签名,因此隐藏了。
  • 您可以在子类中声明不在超类中的新方法。
  • 您可以编写一个隐式或使用关键字super来调用超类的构造函数的子类构造函数。

继承是一种强大的技术,可让您编写干净且可维护的代码。 例如,假设您有一个具有多个后继类的超类。 更改超类中的几行代码,并更改每个继承者的功能,而不是在每个子类的每一端这样做,要容易得多。

Java 继承示例

在下面的示例中,我们创建 3 个类。 超类Point表示二维空间中具有xy坐标的点。

  1. package net.javatutorial;
  2. public class Point {
  3. // fields marking X and Y position of the point
  4. public int x;
  5. public int y;
  6. // one constructor
  7. public Point(int x, int y) {
  8. super();
  9. this.x = x;
  10. this.y = y;
  11. }
  12. // getter and setter methods
  13. public int getX() {
  14. return x;
  15. }
  16. public void setX(int x) {
  17. this.x = x;
  18. }
  19. public int getY() {
  20. return y;
  21. }
  22. public void setY(int y) {
  23. this.y = y;
  24. }
  25. }

ColoredPoint是一个子类,它扩展了Point的所有属性和方法,并添加了一个附加字段 – colorName。 注意这是如何完成的–我们使用关键字extends来告诉我们要从哪个类派生

  1. package net.javatutorial;
  2. public class ColoredPoint extends Point {
  3. // new field added to store the color name
  4. public String colorName;
  5. public ColoredPoint(int x, int y, String colorName) {
  6. super(x, y);
  7. this.colorName = colorName;
  8. }
  9. public String getColorName() {
  10. return colorName;
  11. }
  12. public void setColorName(String colorName) {
  13. this.colorName = colorName;
  14. }
  15. }

最后是一个测试继承的程序。 首先,我们创建一个类型为ColoredPoint的新Point。 请注意关键字instanceof的用法。 这样,我们可以检查对象是否为某种类型。 一旦确定点的类型为ColoredPoint,就可以使用以下方法显式地进行类型转换:

  1. ColoredPoint coloredPoint = (ColoredPoint)point;

现在我们可以访问新属性colorName

  1. package net.javatutorial;
  2. public class InheritanceExample {
  3. public static void main(String[] args) {
  4. Point point = new ColoredPoint(2, 4, "red");
  5. if (point instanceof ColoredPoint) {
  6. ColoredPoint coloredPoint = (ColoredPoint)point;
  7. System.out.println("the color of the point is: " + coloredPoint.getColorName());
  8. System.out.println("with coordinates x=" + coloredPoint.getX() +
  9. " y=" + coloredPoint.getY());
  10. }
  11. }
  12. }

运行上面的示例将产生以下输出

  1. the color of the point is: red
  2. with coordinates x=2 y=4

参考文献

官方 Oracle 继承教程